diff --git a/AddChannel.ui b/AddChannel.ui
index ee81fa2..d687a61 100644
--- a/AddChannel.ui
+++ b/AddChannel.ui
@@ -87,6 +87,28 @@ color: rgb(27, 30, 35);
-
+
+
+ 120
+ 35
+
+
+
+
+ 120
+ 35
+
+
+
+ #pushButton_confirm { border-image: url(:/image/Btn/normal_Btn.png);
+ color:#1f5188 }
+#pushButton_confirm:hover { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_confirm:pressed { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_confirm:checked { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+
确认
@@ -94,6 +116,28 @@ color: rgb(27, 30, 35);
-
+
+
+ 120
+ 35
+
+
+
+
+ 120
+ 35
+
+
+
+ #pushButton_cancel { border-image: url(:/image/Btn/normal_Btn.png);
+ color:#1f5188 }
+#pushButton_cancel:hover { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_cancel:pressed { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_cancel:checked { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+
取消
diff --git a/AlarmDetails.cpp b/AlarmDetails.cpp
new file mode 100644
index 0000000..1072b43
--- /dev/null
+++ b/AlarmDetails.cpp
@@ -0,0 +1,66 @@
+#include "AlarmDetails.h"
+#include "ui_AlarmDetails.h"
+#include
+
+CAlarmDetails::CAlarmDetails(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::CAlarmDetails)
+{
+ ui->setupUi(this);
+ headerStr = QObject::tr("属性,值");
+ model = new QStandardItemModel(ui->tableView);
+ ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选中行
+ QStringList headerList = headerStr.split(",");
+ model->setHorizontalHeaderLabels(headerList);
+ model->setColumnCount(headerList.size());
+ ui->tableView->setModel(model);
+ ui->tableView->setColumnWidth(0, 200);
+ ui->tableView->setColumnWidth(1, 300);
+ model->setRowCount(12);
+}
+
+CAlarmDetails::~CAlarmDetails()
+{
+ delete ui;
+}
+
+void CAlarmDetails::ViewData(TriggerEvent_t& m_vecTriggerEvent)
+{
+ model->setData(model->index(0,0,QModelIndex()),"触发通道名称");
+ model->setData(model->index(0,1,QModelIndex()),m_vecTriggerEvent.triggeredChannelName);
+
+ model->setData(model->index(1,0,QModelIndex()),"触发通道类型");
+ model->setData(model->index(1,1,QModelIndex()),m_vecTriggerEvent.triggeredType);
+
+ model->setData(model->index(2,0,QModelIndex()),"触发值");
+ model->setData(model->index(2,1,QModelIndex()),m_vecTriggerEvent.triggeredValue);
+
+ model->setData(model->index(3,0,QModelIndex()),"触发实际值");
+ model->setData(model->index(3,1,QModelIndex()),m_vecTriggerEvent.triggeredValue);
+
+ model->setData(model->index(4,0,QModelIndex()),"触发提示");
+ model->setData(model->index(4,1,QModelIndex()),m_vecTriggerEvent.triggeredNotification);
+
+ model->setData(model->index(5,0,QModelIndex()),"触发设备号");
+ model->setData(model->index(5,1,QModelIndex()),m_vecTriggerEvent.triggeredDataWatchNo);
+
+ model->setData(model->index(6,0,QModelIndex()),"触发设备名称");
+ model->setData(model->index(6,1,QModelIndex()),m_vecTriggerEvent.triggeredDataWatchName);
+
+ model->setData(model->index(7,0,QModelIndex()),"触发通道号");
+ model->setData(model->index(7,1,QModelIndex()),m_vecTriggerEvent.triggeredChannelID);
+
+ model->setData(model->index(8,0,QModelIndex()),"触发时间");
+ QString TStr = QDateTime::fromSecsSinceEpoch(m_vecTriggerEvent.triggeredTime).toString("yyyy-MM-dd hh:mm:ss");
+ model->setData(model->index(8,1,QModelIndex()),TStr);
+
+ model->setData(model->index(9,0,QModelIndex()),"设备ID");
+ model->setData(model->index(9,1,QModelIndex()),m_vecTriggerEvent.triggeredEquipmentID);
+
+ model->setData(model->index(10,0,QModelIndex()),"事件名称");
+ model->setData(model->index(10,1,QModelIndex()),m_vecTriggerEvent.triggeredEventName);
+
+ model->setData(model->index(11,0,QModelIndex()),"触发特征值名称");
+ model->setData(model->index(11,1,QModelIndex()),m_vecTriggerEvent.triggeredFeatureName);
+
+}
diff --git a/AlarmDetails.h b/AlarmDetails.h
new file mode 100644
index 0000000..b6ce352
--- /dev/null
+++ b/AlarmDetails.h
@@ -0,0 +1,32 @@
+#ifndef ALARMDETAILS_H
+#define ALARMDETAILS_H
+
+#include
+#include //数据模型类
+#include "TableHeaderView.h"
+#include "global.h"
+
+namespace Ui {
+class CAlarmDetails;
+}
+
+class CAlarmDetails : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit CAlarmDetails(QWidget *parent = nullptr);
+ ~CAlarmDetails();
+
+ void ViewData(TriggerEvent_t& m_vecTriggerEvent);
+
+private:
+ Ui::CAlarmDetails *ui;
+
+ TableHeaderView *myHeader;
+ QStandardItemModel *model;
+ QString headerStr ;
+
+};
+
+#endif // ALARMDETAILS_H
diff --git a/AlarmDetails.ui b/AlarmDetails.ui
new file mode 100644
index 0000000..75e32eb
--- /dev/null
+++ b/AlarmDetails.ui
@@ -0,0 +1,39 @@
+
+
+ CAlarmDetails
+
+
+
+ 0
+ 0
+ 802
+ 578
+
+
+
+ 报警详情
+
+
+ font: 16pt "黑体";
+color: rgb(27, 30, 35);
+
+
+
+
-
+
+
+
-
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BoardSetting.cpp b/BoardSetting.cpp
index 530e174..dc7e1fc 100644
--- a/BoardSetting.cpp
+++ b/BoardSetting.cpp
@@ -291,8 +291,8 @@ void CBoardSetting::on_Btn_Confirm_clicked()
'%68','%69','%70',%71,%72,%73,'%74','%75','%76','%77','%78','%79','%80','%81','%82','%83','%84',%85,'%86','%87','%88','%89','%90','%91','%92','%93','%94','%95');").\
arg("NULL").arg(2).arg("true").arg("ACCELEROMETER").arg("0").arg("Bottom").arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg(0).arg(0).arg("false").
arg(0).arg("false").arg(0).arg("false").arg(0).arg(strChannelID).arg("NONE").arg(strChannelName).arg("false").arg(0).arg("false").arg(0).arg("RMSValue").arg("").arg(0).arg("false").arg(0).arg("CTC-AC102").arg("false").arg(0).arg("false").arg(0).arg("").\
- arg("true").arg(strMAC).arg(0).arg(1000).arg(0).arg("Hamming").arg("").arg("").arg(10).arg("5000").arg("").arg(1).arg(1).arg("0").arg("60000").arg(0).arg("NONE").arg("").arg("0").arg(8192).arg("").arg("").arg(timeStamp).\
- arg("m/s^2").arg("").arg("").arg(0).arg(BoardNo).arg(i+1).arg("").arg("false").arg("-2").arg("-20").arg("10.2").arg("").arg("").arg("").arg("").arg("true").arg("").arg(0).arg("").arg("").arg("").arg("").arg("").arg("").arg("").arg(tempOptions.at(ii)["BoardTypeNo"].toInt()).arg("").arg("");
+ arg("true").arg(strMAC).arg(0).arg(1000).arg(0).arg("Hamming").arg("15000").arg("0.5").arg(10).arg("5000").arg("").arg(0).arg(0).arg("0").arg("60000").arg(0).arg("NONE").arg("").arg("0").arg(1024).arg("").arg("").arg(timeStamp).\
+ arg("m/s^2").arg("").arg("").arg(0).arg(BoardNo).arg(i+1).arg("2032").arg("false").arg("-2").arg("-20").arg("10.2").arg("").arg("").arg("").arg("").arg("true").arg("").arg(0).arg("").arg("").arg("").arg("").arg("").arg("").arg("").arg(tempOptions.at(ii)["BoardTypeNo"].toInt()).arg("").arg("峰峰值");
qDebug() << "str" << str << endl;
g_SqliteDB->InsertData(taleName,str);
@@ -312,8 +312,8 @@ void CBoardSetting::on_Btn_Confirm_clicked()
'%68','%69','%70',%71,%72,%73,'%74','%75','%76','%77','%78','%79','%80','%81','%82','%83','%84',%85,'%86','%87','%88','%89','%90','%91','%92','%93','%94','%95');").\
arg("NULL").arg(2).arg("true").arg("PULSE_CURRENT").arg("0").arg("Bottom").arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg(0).arg(0).arg("false").
arg(0).arg("false").arg(0).arg("false").arg(0).arg(strChannelID).arg("NONE").arg(strChannelName).arg("false").arg(0).arg("false").arg(0).arg("RMSValue").arg("").arg(0).arg("false").arg(0).arg("电流变送器").arg("false").arg(0).arg("false").arg(0).arg("").\
- arg("true").arg(MAC).arg(0).arg(1000).arg(0).arg("Hamming").arg("").arg("").arg(20).arg("5000").arg("").arg(1).arg(1).arg("0").arg("60000").arg(0).arg("NONE").arg("").arg("0").arg(8192).arg("").arg("").arg(timeStamp).\
- arg("mA").arg("").arg("").arg(0).arg(BoardNo).arg(i+1).arg("").arg("false").arg("-2").arg("-20").arg("0").arg("").arg("").arg("").arg("").arg("true").arg("").arg(0).arg("").arg("").arg("").arg("20").arg("").arg("4").arg("4").arg(tempOptions.at(ii)["BoardTypeNo"].toInt()).arg("").arg("");
+ arg("true").arg(MAC).arg(0).arg(1000).arg(0).arg("Hamming").arg("").arg("").arg(20).arg("5000").arg("").arg(0).arg(0).arg("0").arg("60000").arg(0).arg("NONE").arg("").arg("0").arg(1024).arg("").arg("").arg(timeStamp).\
+ arg("mA").arg("").arg("").arg(0).arg(BoardNo).arg(i+1).arg("").arg("false").arg("-2").arg("-20").arg("0").arg("").arg("").arg("").arg("").arg("true").arg("").arg(0).arg("").arg("").arg("").arg("20").arg("").arg("4").arg("4").arg(tempOptions.at(ii)["BoardTypeNo"].toInt()).arg("").arg("平均值");
qDebug() << "str" << str << endl;
g_SqliteDB->InsertData(taleName,str);
@@ -332,7 +332,7 @@ void CBoardSetting::on_Btn_Confirm_clicked()
'%68','%69','%70',%71,%72,%73,'%74','%75','%76','%77','%78','%79','%80','%81','%82','%83','%84',%85,'%86','%87','%88','%89','%90','%91','%92','%93','%94','%95');").\
arg("NULL").arg(2).arg("true").arg("SLOW_CURRENT").arg("0").arg("Bottom").arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg("false").arg(0).arg(0).arg(0).arg("false").
arg(0).arg("false").arg(0).arg("false").arg(0).arg(strChannelID).arg("NONE").arg(strChannelName).arg("false").arg(0).arg("false").arg(0).arg("RMSValue").arg("").arg(0).arg("false").arg(0).arg("电流变送器").arg("false").arg(0).arg("false").arg(0).arg("").\
- arg("true").arg(MAC).arg(0).arg(1000).arg(0).arg("Hamming").arg("").arg("").arg(20).arg("5000").arg("").arg(1).arg(1).arg("0").arg("60000").arg(0).arg("NONE").arg("").arg("0").arg(64).arg("").arg("").arg(timeStamp).\
+ arg("true").arg(MAC).arg(0).arg(1000).arg(0).arg("Hamming").arg("").arg("").arg(20).arg("5000").arg("").arg(0).arg(0).arg("0").arg("60000").arg(0).arg("NONE").arg("").arg("0").arg(64).arg("").arg("").arg(timeStamp).\
arg("mA").arg("").arg("").arg(0).arg(BoardNo).arg(i+1).arg("").arg("false").arg("-2").arg("-20").arg("0").arg("").arg("").arg("").arg("").arg("true").arg("").arg(0).arg("").arg("").arg("").arg("20").arg("").arg("4").arg("4").arg(tempOptions.at(ii)["BoardTypeNo"].toInt()).arg("").arg("");
qDebug() << "str" << str << endl;
@@ -361,7 +361,7 @@ void CBoardSetting::on_Btn_Confirm_clicked()
'%68','%69','%70',%71,%72,%73,'%74','%75','%76','%77','%78','%79','%80','%81','%82','%83','%84',%85,'%86','%87','%88','%89','%90','%91','%92','%93','%94','%95');").\
arg("NULL").arg(2).arg("false").arg(strchannelType).arg("0").arg("").arg("").arg(0).arg("").arg(0).arg("").arg(0).arg("").arg(0).arg("").arg(0).arg("").arg(0).arg(0).arg(0).arg("").
arg(0).arg("").arg(0).arg("").arg(0).arg(strChannelID).arg("").arg(strChannelName).arg("").arg(0).arg("").arg(0).arg("").arg("").arg(0).arg("").arg(0).arg("").arg("").arg(0).arg("").arg(0).arg("").\
- arg("true").arg(MAC).arg(0).arg(1000).arg(0).arg("").arg("").arg("").arg(10).arg("").arg("").arg(1).arg(1).arg("0").arg("").arg(0).arg("").arg("").arg("0").arg(0).arg("").arg("").arg(timeStamp).\
+ arg("true").arg(MAC).arg(0).arg(1000).arg(0).arg("").arg("").arg("").arg(10).arg("").arg("").arg(0).arg(0).arg("0").arg("").arg(0).arg("").arg("").arg("0").arg(0).arg("").arg("").arg(timeStamp).\
arg("").arg("").arg("").arg(0).arg(BoardNo).arg(i+1).arg("").arg("false").arg("-2").arg("-20").arg("0").arg("").arg("").arg("").arg("").arg("").arg("").arg(2).arg("").arg("").arg("").arg("").arg("").arg("").arg("").arg(tempOptions.at(ii)["BoardTypeNo"].toInt()).arg("").arg("");
qDebug() << "str" << str << endl;
diff --git a/ChannelList.cpp b/ChannelList.cpp
index f8da66d..909441b 100644
--- a/ChannelList.cpp
+++ b/ChannelList.cpp
@@ -493,12 +493,12 @@ void CChannelList::slotRowDoubleClicked(const QModelIndex &index)
{
if(g_channelSetting[m_nCurRow].boardType.toInt() == 1 && g_channelSetting[i].channelId == g_channelSetting[m_nCurRow].channelId){//开入开出板卡
- CSlowSpeedChannelSetting *dialog = new CSlowSpeedChannelSetting();
- connect(dialog, SIGNAL(sgSetChannelData(ChannelSetting)), this, SLOT(slotSetChannelData(ChannelSetting)));
- dialog->channelSetting = g_channelSetting[i];
- dialog->setWindowModality(Qt::ApplicationModal);
- dialog->displayChannelSetting();
- dialog->show();
+ CSlowSpeedChannelSetting *dialog = new CSlowSpeedChannelSetting();
+ connect(dialog, SIGNAL(sgSetChannelData(ChannelSetting)), this, SLOT(slotSetChannelData(ChannelSetting)));
+ dialog->channelSetting = g_channelSetting[i];
+ dialog->setWindowModality(Qt::ApplicationModal);
+ dialog->displayChannelSetting();
+ dialog->show();
}
else if(g_channelSetting[m_nCurRow].boardType.toInt() > 1 && g_channelSetting[m_nCurRow].boardType.toInt() < 5 && g_channelSetting[i].channelId == g_channelSetting[m_nCurRow].channelId){//高速板卡
@@ -572,7 +572,7 @@ void CChannelList::on_pushButton_open_clicked()
//model->setData(model->index(i,4),QBrush(Qt::red), Qt::BackgroundRole);
model->setItem(i,4,new QStandardItem("启用"));
QString strChannelID = model->data(model->index(i,38)).toString();
- QString strUpdateSql = QString(" set isEnable = %1 where channelId = '%2' ").arg(1).arg(g_channelSetting[i].channelId);
+ QString strUpdateSql = QString(" set isEnable = %1 , isWork = %2 where channelId = '%3' ").arg(1).arg(1).arg(g_channelSetting[i].channelId);
QString tableName = "t_ChannelSetting ";
g_SqliteDB->UpdateDataSql(tableName,strUpdateSql);
g_channelSetting = g_SqliteDB->GetDataMultiLine("t_ChannelSetting");
diff --git a/ChannelSetting.cpp b/ChannelSetting.cpp
index 43683c8..6f10656 100644
--- a/ChannelSetting.cpp
+++ b/ChannelSetting.cpp
@@ -49,7 +49,7 @@ CChannelSetting::CChannelSetting(QWidget *parent) :
ui->lineEdit_tachTriggerPerRev->setValidator(Validator);
ui->lineEdit_tachTriggerHysteresis->setValidator(Validator);
- connect(ui->channelTypeCombox,SIGNAL(currentTextChanged(QString)),this,SLOT(on_channelTypeCombox_currentTextChanged(const QString&)));
+ connect(ui->channelTypeCombox,SIGNAL(currentTextChanged(const QString&)),this,SLOT(on_channelTypeCombox_currentTextChanged(const QString&)));
}
@@ -60,6 +60,17 @@ CChannelSetting::~CChannelSetting()
void CChannelSetting::displayChannelSetting()
{
+ ui->channelTypeCombox->addItems(ChannelTypeList);
+
+ qDebug() <<"channelSetting.sensorType" << channelSetting.sensorType <::Iterator iter = g_MapChannelType.begin();
+ for (; iter != g_MapChannelType.end(); iter++) {
+ if(iter.key() == channelSetting.sensorType){
+ ui->channelTypeCombox->setCurrentText(iter.value());
+ break;
+ }
+ }
+
m_itemList << "是" << "否" ;
m_DisPlayerList << "峰峰值" << "有效值" << "峰值" <<"平均值";
@@ -67,7 +78,7 @@ void CChannelSetting::displayChannelSetting()
ui->label_modelNo->setText(string_modelNo);
QString string_sensorNo = QString("%1").arg(channelSetting.sensorNo);
ui->label_channelNo->setText(string_sensorNo);
- ui->channelTypeCombox->addItems(ChannelTypeList);
+
ui->comboBox_coupling->clear();
ui->comboBox_coupling->addItem("AC");
@@ -77,21 +88,15 @@ void CChannelSetting::displayChannelSetting()
ui->comboBox_defaultDisplay->addItems(m_DisPlayerList);
ui->comboBox_defaultDisplay->setCurrentText(channelSetting.defaultDisplay);
+ ui->lineEdit_sensorRange->setText(channelSetting.sensorRange);
+ ui->lineEdit_sensorRange_2->setText(channelSetting.sensorRange);
+
+
if(channelSetting.couplingACDC)
ui->comboBox_coupling->setCurrentText("AC");
else
ui->comboBox_coupling->setCurrentText("DC");
-
- qDebug() <<"channelSetting.sensorType" << channelSetting.sensorType <::Iterator iter = g_MapChannelType.begin();
- for (; iter != g_MapChannelType.end(); iter++) {
- if(iter.key() == channelSetting.sensorType){
- ui->channelTypeCombox->setCurrentText(iter.value());
- }
- }
-
-
ui->RPMComBox->addItem("- -");
ui->pairChannelComBox->addItem("- -");
QMap>::iterator iterChannel = g_MapChannel.begin();
@@ -143,6 +148,7 @@ void CChannelSetting::displayChannelSetting()
ui->comboBox_sensorICP->setCurrentText("是");
else
ui->comboBox_sensorICP->setCurrentText("否");
+
ui->lineEdit_frequencyRangeMax->setText(channelSetting.frequencyRangeMax);
ui->lineEdit_frequencyRangeMin->setText(channelSetting.frequencyRangeMin);
@@ -159,7 +165,7 @@ void CChannelSetting::displayChannelSetting()
ui->lineEdit_vMin->setText(sensorRangeMin);
- strListFs << "1kHz"<<"2kHz"<<"4kHz"<<"8kHz" << "16kHz";
+ strListFs << "1kHz"<<"2kHz"<<"4kHz"<<"8kHz";
ui->comboBox_samplingRate->addItems(strListFs);
if(channelSetting.samplingRate == 1024)
ui->comboBox_samplingRate->setCurrentText("1kHz");
@@ -169,8 +175,8 @@ void CChannelSetting::displayChannelSetting()
ui->comboBox_samplingRate->setCurrentText("4kHz");
if(channelSetting.samplingRate == 8192)
ui->comboBox_samplingRate->setCurrentText("8kHz");
- if(channelSetting.samplingRate == 16384)
- ui->comboBox_samplingRate->setCurrentText("16kHz");
+// if(channelSetting.samplingRate == 16384)
+// ui->comboBox_samplingRate->setCurrentText("16kHz");
QString envelopeLowpassband = QString("%1").arg(channelSetting.envelopeLowpassband);
ui->lineEdit_envelopeLowpassband->setText(envelopeLowpassband);
@@ -242,18 +248,21 @@ void CChannelSetting::displayChannelSetting()
if(channelSetting.samplingRate == 131072)
ui->comboBox_samplingRate_2->setCurrentText("128kHz");
+ ui->lineEdit_sensorLeftOrRight->setText(channelSetting.sensorLeftOrRight);
ui->comboBox_tachAutoTach->addItems(m_itemList);
if(channelSetting.tachAutoTach )
ui->comboBox_tachAutoTach->setCurrentText("是");
else
ui->comboBox_tachAutoTach->setCurrentText("否");
- ui->comboBox_tachTriggerEdge->addItem("rising");
- ui->comboBox_tachTriggerEdge->addItem("falling");
- if(channelSetting.tachTriggerEdge == "rising")
- ui->comboBox_tachTriggerEdge->setCurrentText("rising");
- else
- ui->comboBox_tachTriggerEdge->setCurrentText("falling");
+ QString tachTriggerVoltageLevel = QString("%1").arg(channelSetting.tachTriggerVoltageLevel);
+ ui->lineEdit_tachTriggerVoltageLevel->setText(tachTriggerVoltageLevel);
+ ui->lineEdit_tachTriggerPerRev->setText(channelSetting.tachTriggerPerRev);
+ QString tachTriggerHysteresis = QString("%1").arg(channelSetting.tachTriggerHysteresis);
+ ui->lineEdit_tachTriggerHysteresis->setText(tachTriggerHysteresis);
+ ui->comboBox_tachTriggerEdge->addItem("上升沿");
+ ui->comboBox_tachTriggerEdge->addItem("下降沿");
+ ui->comboBox_tachTriggerEdge->setCurrentText(channelSetting.tachTriggerEdge);
}
@@ -280,15 +289,26 @@ void CChannelSetting::on_pushButton_submit_clicked()
channelSetting.defaultDisplay = ui->comboBox_defaultDisplay->currentText();
+
+
channelSetting.pairChannelName = ui->pairChannelComBox->currentText();
+
for (int i = 0; i < g_ChannelBaseInfo.size(); i++) {
if(g_ChannelBaseInfo[i].channelName == ui->RPMComBox->currentText()){
channelSetting.speedRefChannelId = g_ChannelBaseInfo[i].channelID;
channelSetting.speedRefChannelName = g_ChannelBaseInfo[i].channelName;
+ }else if(ui->RPMComBox->currentText() == "- -")
+ {
+ channelSetting.speedRefChannelId = "";
+ channelSetting.speedRefChannelName = "";
}
if(g_ChannelBaseInfo[i].channelName == ui->pairChannelComBox->currentText()){
channelSetting.pairChannelId = g_ChannelBaseInfo[i].channelID;
channelSetting.pairChannelName = g_ChannelBaseInfo[i].channelName;
+ }else if(ui->pairChannelComBox->currentText() == "- -")
+ {
+ channelSetting.pairChannelId = "";
+ channelSetting.pairChannelId = "";
}
}
channelSetting.rpmMultiplier = ui->lineEdit_rpmMultiplier->text();
@@ -328,19 +348,25 @@ void CChannelSetting::on_pushButton_submit_clicked()
channelSetting.samplingRate = 4096;
else if(strSamplingRate == "8kHz")
channelSetting.samplingRate = 8192;
- else if(strSamplingRate == "16kHz")
- channelSetting.samplingRate = 16384;
+// else if(strSamplingRate == "16kHz")
+// channelSetting.samplingRate = 16384;
channelSetting.channelName = ui->lineEdit_ChannelName->text();
-// channelSetting.isEnable = 1;
-// channelSetting.isWork = 1;
+ channelSetting.isEnable = 1;
+ channelSetting.isWork = 1;
channelSetting.ChUnitCoeff = ui->lineEdit_ChUnitCoeff->text().toDouble();
channelSetting.ChUnitDot = ui->lineEdit_ChUnitDot->text().toInt();
channelSetting.sensorGapVoltage = ui->lineEdit_sensorGapVoltage->text();
channelSetting.bearingClearance = ui->lineEdit_bearingClearance->text();
+ channelSetting.sensorLocationInDegree = ui->lineEdit_sensorLocationInDegree->text().toInt();
+ channelSetting.sensorLeftOrRight = ui->lineEdit_sensorLeftOrRight->text();
+ channelSetting.sensor1xPhaseRunout = ui->lineEdit_sensor1xPhaseRunout->text();
+ channelSetting.sensor1xAmplitudeRunout = ui->lineEdit_sensor1xAmplitudeRunout->text();
+ channelSetting.envelopeHighpassband = ui->lineEdit_envelopeHighpassband->text().toDouble();
+ channelSetting.envelopeLowpassband = ui->lineEdit_envelopeLowpassband->text().toDouble();
if(ui->tabWidget->currentIndex() == 1){
channelSetting.sensorEngineeringUnit = ui->lineEdit_sensorEngineeringUnit_2->text();
channelSetting.channelSensorType = ui->lineEdit_SensorType_2->text();
@@ -380,12 +406,17 @@ void CChannelSetting::on_pushButton_submit_clicked()
channelSetting.samplingRate = 4096;
else if(strSamplingRate == "8kHz")
channelSetting.samplingRate = 8192;
- else if(strSamplingRate == "16kHz")
- channelSetting.samplingRate = 16384;
+// else if(strSamplingRate == "16kHz")
+// channelSetting.samplingRate = 16384;
- channelSetting.tachTriggerEdge = ui->comboBox_tachTriggerEdge->currentText();
+ if(ui->comboBox_tachTriggerEdge->currentText() == "上升沿")
+ channelSetting.tachTriggerEdge = "rising";
+ else
+ channelSetting.tachTriggerEdge = "falling";
+
channelSetting.sensorSensitivity ="0";
+ channelSetting.defaultDisplay = "转速";
}
QDateTime timeNow = QDateTime::currentDateTime();
@@ -397,9 +428,14 @@ void CChannelSetting::on_pushButton_submit_clicked()
void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg1)
{
+ qDebug() << arg1 << endl;
if(arg1 == "转速"){
ui->tabWidget->setCurrentIndex(1);
- ui->comboBox_samplingRate_2->setCurrentText("128kHz");
+ ui->comboBox_samplingRate_2->setCurrentText("8kHz");
+ ui->lineEdit_tachTriggerVoltageLevel->setText("-10");
+ ui->lineEdit_tachTriggerPerRev->setText("1");
+ ui->lineEdit_tachTriggerHysteresis->setText("2");
+ ui->lineEdit_sensorRange_2->setText("20000");
}else{
ui->tabWidget->setCurrentIndex(0);
if(arg1 == "加速度"){
@@ -418,7 +454,9 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->lineEdit_vMin->setText("-20");
ui->comboBox_samplingRate->clear();
ui->comboBox_samplingRate->addItems(strListFs);
- ui->comboBox_samplingRate->setCurrentText("16kHz");
+ ui->comboBox_samplingRate->setCurrentText("1kHz");
+ ui->pairChannelComBox->setCurrentText("- -");
+ ui->RPMComBox->setCurrentText("- -");
QString str = QString("%1").arg(16*1024/2.56);
ui->lineEdit_analyseRate->setText(str);
ui->lineEdit_RateRatio->setText("1");
@@ -427,6 +465,7 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
// ui->comboBox_coupling->addItem("DC");
ui->lineEdit_envelopeLowpassband->setText("10");
ui->lineEdit_envelopeHighpassband->setText("3500");
+ ui->lineEdit_sensorRange->setText("2032");
}else if(arg1 == "速度"){
ui->lineEdit_SensorType->setText("CTC-VE102");
@@ -442,7 +481,7 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->lineEdit_vMin->setText("-20");
ui->comboBox_samplingRate->clear();
ui->comboBox_samplingRate->addItems(strListFs);
- ui->comboBox_samplingRate->setCurrentText("8kHz");
+ ui->comboBox_samplingRate->setCurrentText("1kHz");
QString str = QString("%1").arg(8*1024/2.56);
ui->lineEdit_analyseRate->setText(str);
ui->lineEdit_RateRatio->setText("1");
@@ -451,6 +490,9 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->comboBox_coupling->addItem("DC");
ui->lineEdit_envelopeLowpassband->setText("4.5");
ui->lineEdit_envelopeHighpassband->setText("5000");
+ ui->pairChannelComBox->setCurrentText("- -");
+ ui->RPMComBox->setCurrentText("- -");
+ ui->lineEdit_sensorRange->setText("2054");
}else if(arg1 == "声音"){
ui->lineEdit_SensorType->setText("378B02");
@@ -466,7 +508,7 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->lineEdit_vMin->setText("-20");
ui->comboBox_samplingRate->clear();
ui->comboBox_samplingRate->addItems(strListFs);
- ui->comboBox_samplingRate->setCurrentText("16kHz");
+ ui->comboBox_samplingRate->setCurrentText("1kHz");
QString str = QString("%1").arg(16*1024/2.56);
ui->lineEdit_analyseRate->setText(str);
ui->lineEdit_RateRatio->setText("1");
@@ -475,6 +517,9 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->comboBox_coupling->addItem("DC");
ui->lineEdit_envelopeLowpassband->setText("350");
ui->lineEdit_envelopeHighpassband->setText("12000");
+ ui->pairChannelComBox->setCurrentText("- -");
+ ui->RPMComBox->setCurrentText("- -");
+ ui->lineEdit_sensorRange->setText("2000");
}else if(arg1 == "径向振动位移"){
ui->lineEdit_SensorType->setText("CTC-DP1001");
@@ -491,7 +536,7 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->lineEdit_vMin->setText("-20");
ui->comboBox_samplingRate->clear();
ui->comboBox_samplingRate->addItems(strListFs);
- ui->comboBox_samplingRate->setCurrentText("8kHz");
+ ui->comboBox_samplingRate->setCurrentText("1kHz");
QString str = QString("%1").arg(8*1024/2.56);
ui->lineEdit_analyseRate->setText(str);
ui->lineEdit_RateRatio->setText("1");
@@ -500,6 +545,9 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->comboBox_coupling->addItem("AC");
ui->lineEdit_envelopeLowpassband->setText("1");
ui->lineEdit_envelopeHighpassband->setText("4000");
+ ui->pairChannelComBox->setCurrentText("- -");
+ ui->RPMComBox->setCurrentText("- -");
+ ui->lineEdit_sensorRange->setText("2000");
}else if(arg1 == "轴向位移"){
ui->lineEdit_SensorType->setText("CTC-DP1001");
@@ -516,7 +564,7 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->lineEdit_vMin->setText("-20");
ui->comboBox_samplingRate->clear();
ui->comboBox_samplingRate->addItems(strListFs);
- ui->comboBox_samplingRate->setCurrentText("8kHz");
+ ui->comboBox_samplingRate->setCurrentText("1kHz");
QString str = QString("%1").arg(8*1024/2.56);
ui->lineEdit_analyseRate->setText(str);
ui->lineEdit_RateRatio->setText("1");
@@ -525,6 +573,9 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->comboBox_coupling->addItem("AC");
ui->lineEdit_envelopeLowpassband->setText("1");
ui->lineEdit_envelopeHighpassband->setText("4000");
+ ui->pairChannelComBox->setCurrentText("- -");
+ ui->RPMComBox->setCurrentText("- -");
+ ui->lineEdit_sensorRange->setText("2");
}else if(arg1 == "动态电压"){
ui->lineEdit_SensorType->setText("");
ui->lineEdit_sensorEngineeringUnit->setText("");
@@ -539,7 +590,7 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->lineEdit_vMin->setText("-20");
ui->comboBox_samplingRate->clear();
ui->comboBox_samplingRate->addItems(strListFs);
- ui->comboBox_samplingRate->setCurrentText("8kHz");
+ ui->comboBox_samplingRate->setCurrentText("1kHz");
QString str = QString("%1").arg(8*1024/2.56);
ui->lineEdit_analyseRate->setText(str);
ui->lineEdit_RateRatio->setText("1");
@@ -548,6 +599,9 @@ void CChannelSetting::on_channelTypeCombox_currentTextChanged(const QString &arg
ui->comboBox_coupling->addItem("AC");
ui->lineEdit_envelopeLowpassband->setText("0");
ui->lineEdit_envelopeHighpassband->setText("5000");
+ ui->pairChannelComBox->setCurrentText("- -");
+ ui->RPMComBox->setCurrentText("- -");
+ ui->lineEdit_sensorRange->setText("2000");
}
}
}
@@ -630,6 +684,7 @@ void CChannelSetting::slotSetChannelData(QStringList& listChannelName)
g_SqliteDB->UpdateDataSql(tableName,strUpdateSql);
}
}
+
void CChannelSetting::on_pushButton_copy_clicked()
{
//sensorModuleNo
diff --git a/CharacteristicList.cpp b/CharacteristicList.cpp
index b16d451..8be5790 100644
--- a/CharacteristicList.cpp
+++ b/CharacteristicList.cpp
@@ -74,7 +74,14 @@ void CCharacteristicList::DisPlayCharacteristic()
model->setData(model->index(j,2,QModelIndex()),g_Charateristic[j].DerivedPeak);
}else if(g_ChannelBaseInfo[i].defaultDisplay == "平均值"){
model->setData(model->index(j,2,QModelIndex()),g_Charateristic[j].DCValues);
+ }else if(g_ChannelBaseInfo[i].defaultDisplay == "转速"){
+ model->setData(model->index(j,2,QModelIndex()),g_Charateristic[j].speedRPM);
}
+ //qDebug() << g_ChannelBaseInfo[i].boardType << g_Charateristic[j].DCValues <setData(model->index(j,2,QModelIndex()),g_Charateristic[j].DCValues);
+ }
+
model->setData(model->index(j,3,QModelIndex()),QString::number(g_Charateristic[j].MonitorPk2Pk,'f',2));
model->setData(model->index(j,4,QModelIndex()),g_Charateristic[j].Amp1x);
diff --git a/Configuration.cpp b/Configuration.cpp
index 2df7bd3..c437067 100644
--- a/Configuration.cpp
+++ b/Configuration.cpp
@@ -24,7 +24,7 @@ CConfiguration::CConfiguration(QWidget *parent) :
Init();
- connect(ui->comboBox_WC,SIGNAL(currentIndexChanged(const QString &)),this,SLOT(on_comboBox_WC_currentTextChanged(const QString&)));
+ connect(ui->comboBox_WC,SIGNAL(currentTextChanged(const QString &)),this,SLOT(on_comboBox_WC_currentTextChanged2(const QString&)));
}
@@ -75,6 +75,7 @@ void CConfiguration::Init()
model_Available->appendRow(item2);
QStandardItem *itemAnd = new QStandardItem(QString("logicAND(1)"));
+ itemAnd->setData(1,Qt::UserRole+1);
QStandardItem *itemOr = new QStandardItem(QString("logicOR"));
item1->appendRow(itemAnd);
item1->appendRow(itemOr);
@@ -98,6 +99,7 @@ void CConfiguration::Init()
ui->comboBox_WC->clear();
ui->comboBox_WC->addItems(strWorkConditionList);
QString strWC = ui->comboBox_WC->currentText();
+ qDebug() << strWC;
arrayTriggerConfig = document.array();
for (int i = 0; i < arrayTriggerConfig.size(); i++) {
if(strWC == arrayTriggerConfig.at(i)["workConditionName"].toString()){
@@ -113,7 +115,6 @@ void CConfiguration::Init()
QString channelName = TriggerSettings.at(j)["channelName"].toString();
QStandardItem *itemChannel = new QStandardItem(QString(channelName));
QJsonArray arrayConfig = TriggerSettings.at(j)["triggerConfig"].toArray();
- qDebug() << "arrayConfig size" < 0){
item2->appendRow(itemChannel);
@@ -345,6 +346,7 @@ QJsonObject CConfiguration::SelectChannel(int channelNo)
}
return ConfiguraitonsObj;
}
+
void CConfiguration::on_pushButton_confirm_clicked()
{
@@ -469,8 +471,9 @@ void CConfiguration::on_pushButton_confirm_clicked()
}
-void CConfiguration::on_comboBox_WC_currentTextChanged(const QString &arg1)
+void CConfiguration::on_comboBox_WC_currentTextChanged2(const QString &arg1)
{
+ qDebug() << "on_comboBox_WC_currentTextChanged" << endl;
for(int i = 0;i < model_Available->rowCount() ;i++){
QStandardItem *item = model_Available->item(i);
if(item->text() == "Operand"){
@@ -844,13 +847,13 @@ void CConfiguration::on_radioButton_6_clicked()
void CConfiguration::on_radioButton_8_clicked()
{
- ViewRelay(9);
+ ViewRelay(10);
}
void CConfiguration::on_radioButton_7_clicked()
{
- ViewRelay(10);
+ ViewRelay(9);
}
diff --git a/Configuration.h b/Configuration.h
index 7bfb9cc..f475adb 100644
--- a/Configuration.h
+++ b/Configuration.h
@@ -26,7 +26,7 @@ private slots:
void slotModifyItem();
void on_pushButton_confirm_clicked();
- void on_comboBox_WC_currentTextChanged(const QString &arg1);
+ void on_comboBox_WC_currentTextChanged2(const QString &arg1);
void on_pushButton_save_clicked();
diff --git a/Configuration.ui b/Configuration.ui
index 2c307da..cd750fd 100644
--- a/Configuration.ui
+++ b/Configuration.ui
@@ -220,6 +220,19 @@ color: rgb(27, 30, 35);
+
+
+ 0
+ 220
+ 177
+ 31
+
+
+
+ 继电器9
+
+
+
0
@@ -232,19 +245,6 @@ color: rgb(27, 30, 35);
继电器10
-
-
-
- 0
- 223
- 177
- 31
-
-
-
- 继电器9
-
-
diff --git a/DataWatch3500_GUI.pro b/DataWatch3500_GUI.pro
index d9f4b6f..a62ed74 100644
--- a/DataWatch3500_GUI.pro
+++ b/DataWatch3500_GUI.pro
@@ -26,15 +26,19 @@ CONFIG += c++11
SOURCES += \
AddChannel.cpp \
+ AlarmDetails.cpp \
CharacteristicList.cpp \
Configuration.cpp \
CopyChannelSetting.cpp \
DIO_Board.cpp \
FileServerConfig.cpp \
HistoryAlarm.cpp \
+ Mqttclient.cpp \
NTPServerConfig.cpp \
NetMgr.cpp \
PSConfig.cpp \
+ QGraphicsMovieItem.cpp \
+ QMyTableViewBtnDelegate.cpp \
RealTimeAlarm.cpp \
SlowSpeedChannelSetting.cpp \
SystemSelfcheck.cpp \
@@ -48,6 +52,7 @@ SOURCES += \
ftpclient.cpp \
global.cpp \
headerView.cpp \
+ log.cpp \
mainwindow.cpp \
main.cpp \
qcustomplot.cpp \
@@ -64,15 +69,19 @@ SOURCES += \
HEADERS += \
AddChannel.h \
+ AlarmDetails.h \
CharacteristicList.h \
Configuration.h \
CopyChannelSetting.h \
DIO_Board.h \
FileServerConfig.h \
HistoryAlarm.h \
+ Mqttclient.h \
NTPServerConfig.h \
NetMgr.h \
PSConfig.h \
+ QGraphicsMovieItem.h \
+ QMyTableViewBtnDelegate.h \
RealTimeAlarm.h \
SlowSpeedChannelSetting.h \
SystemSelfcheck.h \
@@ -86,6 +95,7 @@ HEADERS += \
ftpclient.h \
global.h \
headerView.h \
+ log.h \
mainwindow.h \
qcustomplot.h \
quihelper.h \
@@ -101,6 +111,7 @@ HEADERS += \
FORMS += \
AddChannel.ui \
+ AlarmDetails.ui \
CharacteristicList.ui \
Configuration.ui \
CopyChannelSetting.ui \
@@ -137,3 +148,9 @@ RESOURCES += \
DISTFILES += \
image/Btn/btn.png \
image/Btn/btn_p.png
+
+INCLUDEPATH += $$PWD/include/mqtt
+
+win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/mqtt/ -lQt5Qmqtt
+else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/mqtt/ -lQt5Qmqttd
+else:unix: LIBS += -L$$PWD/lib/MQTT/ -lQt5Qmqtt
diff --git a/DataWatch3500_GUI.pro.user b/DataWatch3500_GUI.pro.user
index a41c556..85c2fc3 100644
--- a/DataWatch3500_GUI.pro.user
+++ b/DataWatch3500_GUI.pro.user
@@ -1,6 +1,6 @@
-
+
EnvironmentId
@@ -94,7 +94,7 @@
Desktop Qt 5.12.11 MinGW 32-bit
Desktop Qt 5.12.11 MinGW 32-bit
qt.qt5.51211.win32_mingw73_kit
- 1
+ 0
0
0
@@ -301,7 +301,7 @@
true
false
true
- E:/WorkSpace/3500/build-DataWatch3500_GUI-Desktop_Qt_5_12_11_MinGW_32_bit-Release
+ E:/WorkSpace/3500/build-DataWatch3500_GUI-Desktop_Qt_5_12_11_MinGW_32_bit-Debug
1
diff --git a/FileServerConfig.cpp b/FileServerConfig.cpp
index 5df15d6..e7cc5dd 100644
--- a/FileServerConfig.cpp
+++ b/FileServerConfig.cpp
@@ -164,9 +164,9 @@ void CFileServerConfig::on_pushButtonPush_clicked()
fileName = QCoreApplication::applicationDirPath() + "\\config\\ServerConfig.json";
QFile file2(fileName);
- file.open(QIODevice::WriteOnly);
- file.write(jsonDoc.toJson());
- file.close();
+ file2.open(QIODevice::WriteOnly);
+ file2.write(jsonDoc.toJson());
+ file2.close();
QString str3 = QString("ftp://%1/CIDW/qtconfig/%2").arg(IP).arg("ServerConfig.json");
g_FtpClient->SetServerInfo(str3);
@@ -177,6 +177,15 @@ void CFileServerConfig::on_pushButtonPush_clicked()
void CFileServerConfig::slotNetMgr(QString sAddr, const QVariant &msg)
{
QJsonObject objec = msg.value();
+ bool Status = objec.take("success").toBool();
+ QString strMessage = objec.take("message").toString();
+ if(Status){
+ //QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("获取成功!"));
+ }else{
+ QMessageBox::information(this, QStringLiteral("提示"), strMessage);
+ return;
+ }
+
if(objec.contains("cmd"))
{
QJsonValue arrays_value = objec.take("cmd");
diff --git a/HistoryAlarm.cpp b/HistoryAlarm.cpp
index 3135663..0e5e4f0 100644
--- a/HistoryAlarm.cpp
+++ b/HistoryAlarm.cpp
@@ -1,5 +1,10 @@
#include "HistoryAlarm.h"
#include "ui_HistoryAlarm.h"
+#include
+#include "sqlitedb.h"
+#include "QMyTableViewBtnDelegate.h"
+#include "AlarmDetails.h"
+
CHistoryAlarm::CHistoryAlarm(QWidget *parent) :
QWidget(parent),
@@ -16,11 +21,27 @@ CHistoryAlarm::CHistoryAlarm(QWidget *parent) :
ui->tableView->setModel(model);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
ui->tableView->setColumnWidth(2, 300);
+ ui->tableView->setColumnWidth(3, 300);
+ ui->tableView->setColumnWidth(4, 300);
ui->tableView->setAlternatingRowColors(true);
- model->setRowCount(10);
+
ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents);
ui->tableView->horizontalHeader()->setSectionResizeMode(5,QHeaderView::ResizeToContents);
+ ui->dateTimeEdit_start->setCalendarPopup(true);
+ ui->dateTimeEdit_end->setCalendarPopup(true);
+
+ QDateTime curDateTime=QDateTime::currentDateTime();//通过QDateTime的currentDateTime获得当前的日期时间,并赋值给curDateTime
+ ui->dateTimeEdit_start->setDateTime(curDateTime);
+ ui->dateTimeEdit_end->setDateTime(curDateTime);
+
+ ui->comboBox_channel->setView(new QListView());
+
+ connect(ui->comboBox_channel,SIGNAL(currentIndexChanged(const QString &)),this,SLOT(on_comboBox_channel_currentTextChanged(const QString&)));
+
+ for (int i = 0; i < g_ChannelBaseInfo.size(); i++) {
+ ui->comboBox_channel->insertItem(i,g_ChannelBaseInfo[i].channelName);
+ }
}
@@ -28,3 +49,64 @@ CHistoryAlarm::~CHistoryAlarm()
{
delete ui;
}
+
+void CHistoryAlarm::on_comboBox_channel_currentTextChanged(const QString& strChannelName)
+{
+ int i = 0;
+ for (i = 0; i < g_ChannelBaseInfo.size(); i++) {
+ if(strChannelName == g_ChannelBaseInfo[i].channelName){
+ m_strChannelID = g_ChannelBaseInfo[i].channelID;
+ break;
+ }
+ }
+
+}
+
+void CHistoryAlarm::createRowItem(int Row,QVariantList RowItem)
+{
+ model->setRowCount(Row+1);
+
+ for (int j = 0; j < RowItem.size(); ++j)
+ {
+ model->setData(model->index(Row,j,QModelIndex()),RowItem.at(j));
+ }
+}
+
+void CHistoryAlarm::on_pushButton_search_clicked()
+{
+ model->removeRows(0, model->rowCount());
+ QDateTime dateTimeStart =ui->dateTimeEdit_start->dateTime();
+ QDateTime dateTimeEnd =ui->dateTimeEdit_end->dateTime();
+ int timestampStart = dateTimeStart.toTime_t();
+ int timestampEnd = dateTimeEnd.toTime_t();
+
+ QString strTableName = "t_TriggerEvent",strSql;
+ strSql = QString(" triggeredTime > %1 and triggeredTime < %2 order by triggeredTime ").arg(timestampStart).arg(timestampEnd);
+ m_vecTriggerEvent = g_SqliteDB->GetTriggerEvent(strTableName,strSql);
+
+ if(m_vecTriggerEvent.size() > 0){
+ for (int i = 0; i < m_vecTriggerEvent.size(); i++) {
+ QVariantList strRowItem ;
+ QString TStr = QDateTime::fromSecsSinceEpoch(m_vecTriggerEvent[i].triggeredTime).toString("yyyy-MM-dd hh:mm:ss");
+ strRowItem << i + 1 << m_vecTriggerEvent[i].triggeredNotification << m_vecTriggerEvent[i].triggeredFeatureName << TStr;
+
+ createRowItem(i,strRowItem);
+ }
+ QMyTableViewBtnDelegate *m_btnDelegate = new QMyTableViewBtnDelegate(QStringList()<<"详情", this);
+ ui->tableView->setItemDelegateForColumn(5, m_btnDelegate);
+ connect(m_btnDelegate, SIGNAL(editData(const QModelIndex &)), this,SLOT(Details(const QModelIndex &)));
+
+ }else{
+ QMessageBox::information(this, "提示", QString("未查询到数据!"));
+ }
+}
+
+void CHistoryAlarm::Details(const QModelIndex &index)
+{
+ int row = index.row();
+ CAlarmDetails *dialog = new CAlarmDetails();
+ dialog->ViewData(m_vecTriggerEvent[row]);
+ dialog->setWindowModality(Qt::ApplicationModal);
+ dialog->show();
+}
+
diff --git a/HistoryAlarm.h b/HistoryAlarm.h
index b9b2636..25c146b 100644
--- a/HistoryAlarm.h
+++ b/HistoryAlarm.h
@@ -20,12 +20,21 @@ public:
explicit CHistoryAlarm(QWidget *parent = nullptr);
~CHistoryAlarm();
+private slots:
+ void on_comboBox_channel_currentTextChanged(const QString&);
+ void on_pushButton_search_clicked();
+ void Details(const QModelIndex &index);
private:
Ui::CHistoryAlarm *ui;
TableHeaderView *myHeader;
QStandardItemModel *model;
QString headerStr ;
+ QString m_strChannelID;
+
+ QVector m_vecTriggerEvent;
+
+ void createRowItem(int Row,QVariantList RowItem);
};
#endif // HISTORYALARM_H
diff --git a/HistoryAlarm.ui b/HistoryAlarm.ui
index f1bef1e..da9be4f 100644
--- a/HistoryAlarm.ui
+++ b/HistoryAlarm.ui
@@ -6,7 +6,7 @@
0
0
- 1054
+ 1148
533
@@ -58,20 +58,7 @@ color: rgb(27, 30, 35);
-
-
-
-
- 150
- 0
-
-
-
-
- 150
- 16777215
-
-
-
+
@@ -85,23 +72,7 @@ color: rgb(27, 30, 35);
-
-
-
-
- 150
- 0
-
-
-
-
- 150
- 16777215
-
-
-
-
-
-
+
@@ -115,7 +86,7 @@ color: rgb(27, 30, 35);
-
-
+
230
@@ -146,7 +117,29 @@ color: rgb(27, 30, 35);
-
-
+
+
+
+ 120
+ 35
+
+
+
+
+ 120
+ 35
+
+
+
+ #pushButton_search { border-image: url(:/image/Btn/normal_Btn.png);
+ color:#1f5188 }
+#pushButton_search:hover { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_search:pressed { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_search:checked { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+
查询
diff --git a/Mqttclient.cpp b/Mqttclient.cpp
new file mode 100644
index 0000000..7e90510
--- /dev/null
+++ b/Mqttclient.cpp
@@ -0,0 +1,159 @@
+#include "MqttClient.h"
+
+MqttClient::MqttClient(QObject *parent) : QObject(parent)
+{
+
+}
+
+void MqttClient::onMQTT_Connected()
+ {
+ qDebug()<< "doConnected" <pushButtonPusblish->setEnabled(true);
+ ui->pushButtonSubscribe->setEnabled(true);
+ ackStatus = "Connection Accepted";
+ break;
+ case QMQTT::CONNACK_PROTO_VER:
+ ackStatus = "Connection Refused: unacceptable protocol version";
+ break;
+ case QMQTT::CONNACK_INVALID_ID:
+ ackStatus = "Connection Refused: identifier rejected";
+ break;
+ case QMQTT::CONNACK_SERVER:
+ ackStatus = "Connection Refused: server unavailable";
+ break;
+ case QMQTT::CONNACK_CREDENTIALS:
+ ackStatus = "Connection Refused: bad user name or password";
+ break;
+ case QMQTT::CONNACK_AUTH:
+ ackStatus = "Connection Refused: not authorized";
+ break;
+ }
+ log(tr("connacked: %1, %2").arg(ack).arg(ackStatus));
+ */
+ }
+
+
+ void MqttClient::onMQTT_error(QMQTT::ClientError err)
+ {
+ //todo: should emit on server suback
+
+ QString errInfo;
+
+ switch(err) {
+ // 0 The connection was refused by the peer (or timed out).
+ case QAbstractSocket::ConnectionRefusedError:
+ errInfo = tr("Connection Refused");
+ // 1 The remote host closed the connection. Note that the client socket (i.e., this socket) will be closed after the remote close notification has been sent.
+ case QAbstractSocket::RemoteHostClosedError:
+ errInfo = tr("Remote Host Closed");
+ // 2 The host address was not found.
+ case QAbstractSocket::HostNotFoundError:
+ errInfo = tr("Host Not Found Error");
+ // 3 The socket operation failed because the application lacked the required privileges.
+ case QAbstractSocket::SocketAccessError:
+ errInfo = tr("Socket Access Error");
+ // 4 The local system ran out of resources (e.g., too many sockets).
+ case QAbstractSocket::SocketResourceError:
+ errInfo = tr("Socket Resource Error");
+ // 5 The socket operation timed out.
+ case QAbstractSocket::SocketTimeoutError:
+ errInfo = tr("Socket Timeout Error");
+ default:
+ errInfo = tr("Socket Error");
+ }
+
+ qDebug()<< errInfo <publish(message);
+ }
+void MqttClient::subscribed(QString strTopic)
+ {
+
+ qDebug()<< "subscribed" <subscribe(strTopic);
+ }
+void MqttClient::ConnectMQTT(QString strIP)
+{
+ m_client = new QMQTT::Client(QHostAddress(strIP),1883);
+
+ //m_client->setHost(QHostAddress("192.168.1.156"));
+ //m_client->setPort(51613);
+ //m_client->setUsername("chaos");
+ //m_client->setPassword("HSD272*#xkd");
+ m_client->connectToHost();
+
+ connect(m_client, SIGNAL(connected()), this, SLOT(onMQTT_Connected()));
+ //todo: should emit on server suback
+ //connect(_client, SIGNAL(connacked(quint8)), this, SLOT(onMQTT_Connacked(quint8)));
+ connect(m_client, SIGNAL(error(QMQTT::ClientError)), this, SLOT(onMQTT_error(QMQTT::ClientError)));
+
+ //slots changes
+ //API: void published(const QMQTT::Message& message);
+ connect(m_client,SIGNAL(published(const QMQTT::Message &)),this,SLOT(onMQTT_Published(const QMQTT::Message &)));
+
+ //todo: should emit on server suback
+ //connect(_client, SIGNAL(pubacked(quint8, quint16)), this, SLOT(onMQTT_Pubacked(quint8, quint16)));
+ connect(m_client, SIGNAL(received(const QMQTT::Message &)), this, SLOT(onMQTT_Received(const QMQTT::Message &)));
+ connect(m_client, SIGNAL(subscribed(const QString &)), this, SLOT(onMQTT_subscribed(const QString &)));
+
+}
diff --git a/Mqttclient.h b/Mqttclient.h
new file mode 100644
index 0000000..53afccb
--- /dev/null
+++ b/Mqttclient.h
@@ -0,0 +1,34 @@
+#ifndef MQTTCLIENT_H
+#define MQTTCLIENT_H
+
+#include
+#include "qmqtt.h"
+#include "global.h"
+
+class MqttClient : public QObject
+{
+ Q_OBJECT
+public:
+ explicit MqttClient(QObject *parent = nullptr);
+ void ConnectMQTT(QString strIP);
+ QMQTT::Client *m_client;
+ void Push(const QMQTT::Message &message);
+ void subscribed(QString strTopic);
+public slots:
+ void onMQTT_Connected();
+ void onMQTT_Connacked(quint8 ack);
+ void onMQTT_error(QMQTT::ClientError err);
+ void onMQTT_Published(const QMQTT::Message &message);
+ void onMQTT_Pubacked(quint8 type, quint16 msgid);
+ void onMQTT_Received(const QMQTT::Message &message);
+ void onMQTT_subscribed(const QString &topic);
+ void onMQTT_subacked(quint16 msgid, quint8 qos);
+ void onMQTT_unsubscribed(const QString &topic);
+ void onMQTT_unsubacked(quint16 msgid);
+ void onMQTT_disconnected();
+signals:
+ void Recevive_sig(QString,QByteArray);
+};
+
+#endif // MQTTCLIENT_H
+
diff --git a/NTPServerConfig.cpp b/NTPServerConfig.cpp
index 05e4e4f..9acd1df 100644
--- a/NTPServerConfig.cpp
+++ b/NTPServerConfig.cpp
@@ -2,6 +2,8 @@
#include "ui_NTPServerConfig.h"
#include "NetMgr.h"
#include
+#include
+#include "ftpclient.h"
CNTPServerConfig::CNTPServerConfig(QWidget *parent) :
QWidget(parent),
@@ -10,6 +12,14 @@ CNTPServerConfig::CNTPServerConfig(QWidget *parent) :
ui->setupUi(this);
ui->widget_3->setProperty("flag", "Title");
ui->widget->setProperty("flag", "normal");
+ QString exp = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.)"
+ "{3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
+ QRegExp rege(exp);
+ QValidator *Validator = new QRegExpValidator(rege);
+ ui->lineEdit_NTP_IP->setValidator(Validator);
+
+ Init();
+
connect(g_NetMgr,SIGNAL(sigNetMgr(QString, const QVariant&)), this, SLOT(slotNetMgr(QString,const QVariant&)));
}
@@ -57,3 +67,100 @@ void CNTPServerConfig::on_pushButton_manual_clicked()
g_NetMgr->PostJson(req,allObj);
}
+void CNTPServerConfig::Init()
+{
+
+ QString fileName = QCoreApplication::applicationDirPath() + "\\config\\ServerConfig.json";
+ if(!fileName.isEmpty())
+ {
+ qDebug() << "打开" << fileName ;
+ QFile file(fileName);
+ file.open(QIODevice::ReadOnly | QIODevice::Text);
+ QString value = file.readAll();
+ file.close();
+
+ QJsonParseError parseJsonErr;
+ QJsonDocument document = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
+ if (!(parseJsonErr.error == QJsonParseError::NoError)) {
+ QMessageBox::about(NULL, "提示", "读取文件错误!");
+ return;
+ }
+ m_ServerObject = document.object();
+ if(m_ServerObject.contains(QStringLiteral("NTP_Server"))){
+ QJsonObject tempObject = m_ServerObject.value(QStringLiteral("NTP_Server")).toObject();
+ QJsonObject OptionObject = tempObject["option"].toObject();
+ ui->lineEdit_NTP_IP->setText(OptionObject["ntpNetworkStation"].toString());
+ if(OptionObject["ntpSwitch"].toString() == "0"){
+ ui->radioButton_switch->setChecked(false);
+ ui->radioButton_switch->setText("关闭");
+ }else if(OptionObject["ntpSwitch"].toString() == "1"){
+ ui->radioButton_switch->setChecked(true);
+ ui->radioButton_switch->setText("启动");
+ }
+ }
+ }
+
+}
+
+void CNTPServerConfig::slotReplyStatus(int result)
+{
+ qDebug()<< "Result" << result << endl;
+ if(!result){
+ QJsonObject NTPServerObj,itemObj;
+ itemObj["ntpNetworkStation"] = ui->lineEdit_NTP_IP->text();
+ if(ui->radioButton_switch->isChecked()){
+ ui->radioButton_switch->setChecked(false);
+ itemObj["ntpSwitch"] = "0";
+ ui->radioButton_switch->setText("关闭");
+ }
+ else{
+ ui->radioButton_switch->setChecked(true);
+ itemObj["ntpSwitch"] = "1";
+ ui->radioButton_switch->setText("启动");
+ }
+
+ NTPServerObj["option"] = itemObj;
+ m_ServerObject["NTP_Server"] = NTPServerObj;
+ QJsonDocument jsonDoc;
+ jsonDoc.setObject(m_ServerObject);
+
+ QString fileName = QCoreApplication::applicationDirPath() + "\\config\\ServerConfig.json";
+ QFile file(fileName);
+ file.open(QIODevice::WriteOnly);
+ file.write(jsonDoc.toJson());
+ file.close();
+ }
+}
+
+void CNTPServerConfig::on_radioButton_switch_clicked()
+{
+ connect(g_FtpClient, SIGNAL(sigReplyStatus(int)), this, SLOT(slotReplyStatus(int)));
+
+ QJsonObject NTPServerObj,itemObj;
+ itemObj["ntpNetworkStation"] = ui->lineEdit_NTP_IP->text();
+ if(ui->radioButton_switch->isChecked()){
+ itemObj["ntpSwitch"] = "1";
+ ui->radioButton_switch->setText("启动");
+ }
+ else{
+ itemObj["ntpSwitch"] = "0";
+ ui->radioButton_switch->setText("关闭");
+ }
+
+ NTPServerObj["option"] = itemObj;
+ m_ServerObject["NTP_Server"] = NTPServerObj;
+ QJsonDocument jsonDoc;
+ jsonDoc.setObject(m_ServerObject);
+
+ QString fileName = QCoreApplication::applicationDirPath() + "\\config\\ServerConfig.json";
+ QFile file(fileName);
+ file.open(QIODevice::WriteOnly);
+ file.write(jsonDoc.toJson());
+ file.close();
+
+ QString str = QString("ftp://%1/CIDW/qtconfig/%2").arg(IP).arg("ServerConfig.json");
+ g_FtpClient->SetServerInfo(str);
+ g_FtpClient->SetUserInfo("root","@#cidw!@123456");
+ g_FtpClient->UpLoadFile(fileName,"ServerConfig.json",4);
+}
+
diff --git a/NTPServerConfig.h b/NTPServerConfig.h
index a283f1c..845bafe 100644
--- a/NTPServerConfig.h
+++ b/NTPServerConfig.h
@@ -25,9 +25,17 @@ private slots:
void on_pushButton_manual_clicked();
void slotNetMgr(QString sAddr,const QVariant& msg);
+ void on_pushButton_NTP_clicked();
+
+ void on_radioButton_switch_clicked();
+
+ void slotReplyStatus(int );
+
private:
Ui::CNTPServerConfig *ui;
- NetMgr *m_pNetMgr;
+
+ void Init();
+ QJsonObject m_ServerObject;
};
#endif // NTPSERVERCONFIG_H
diff --git a/NTPServerConfig.ui b/NTPServerConfig.ui
index d1c2598..af6e466 100644
--- a/NTPServerConfig.ui
+++ b/NTPServerConfig.ui
@@ -88,15 +88,37 @@
B码对时
-
+
30
60
- 103
+ 120
35
+
+
+ 120
+ 35
+
+
+
+
+ 120
+ 35
+
+
+
+ #pushButton_B { border-image: url(:/image/Btn/normal_Btn.png);
+ color:#1f5188 }
+#pushButton_B:hover { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_B:pressed { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_B:checked { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+
B码对时
@@ -111,10 +133,10 @@
- 10
- 40
+ 11
+ 41
410
- 82
+ 81
@@ -135,12 +157,12 @@
- NTP对时地址:
+ NTP对时IP:
-
-
+
200
@@ -158,43 +180,11 @@
-
-
-
-
-
-
-
- 200
- 0
-
-
-
-
- 200
- 16777215
-
-
-
- 时间间隔:
-
-
-
- -
-
-
-
- 200
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
-
+
+
+ 启动
+
+
diff --git a/NetMgr.cpp b/NetMgr.cpp
index 138fba3..a086ecf 100644
--- a/NetMgr.cpp
+++ b/NetMgr.cpp
@@ -341,7 +341,7 @@ void NetMgr::httpFinished(QNetworkReply *reply)
void NetMgr::parseData(const QByteArray &szData, const QString &sUrlPath, QString sAddr)
{
- qDebug() << sUrlPath << szData;
+ //qDebug() << sUrlPath << szData;
QJsonDocument doc = QJsonDocument::fromJson(szData);
QJsonObject obj = doc.object();
QVariant var;
diff --git a/QGraphicsMovieItem.cpp b/QGraphicsMovieItem.cpp
new file mode 100644
index 0000000..8004290
--- /dev/null
+++ b/QGraphicsMovieItem.cpp
@@ -0,0 +1,26 @@
+#include "QGraphicsMovieItem.h"
+
+QGraphicsMovieItem::QGraphicsMovieItem(QGraphicsItem *parent) : QGraphicsItem(parent) {}
+
+void QGraphicsMovieItem::setMovie(QMovie* movie) {
+ prepareGeometryChange();
+ QObject::disconnect(mConnection);
+ mMovie = movie;
+ if (mMovie) {
+ mConnection = QObject::connect(mMovie, &QMovie::frameChanged, [=]{ update(); });
+ }
+}
+
+QRectF QGraphicsMovieItem::boundingRect() const {
+ if (mMovie) { return mMovie->frameRect(); }
+ else { return QRectF(); }
+}
+
+void QGraphicsMovieItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
+ Q_UNUSED(option)
+ Q_UNUSED(widget)
+ if (mMovie) {
+ painter->drawPixmap(mMovie->frameRect(), mMovie->currentPixmap(), mMovie->frameRect());
+
+ }
+}
diff --git a/QGraphicsMovieItem.h b/QGraphicsMovieItem.h
new file mode 100644
index 0000000..12e6e78
--- /dev/null
+++ b/QGraphicsMovieItem.h
@@ -0,0 +1,24 @@
+#ifndef QGRAPHICSMOVIEITEM_H
+#define QGRAPHICSMOVIEITEM_H
+
+#include
+#include
+#include
+#include
+
+class QGraphicsMovieItem : public QGraphicsItem
+{
+ //Q_OBJECT
+public:
+ QGraphicsMovieItem(QGraphicsItem *parent = nullptr);
+ void setMovie(QMovie* movie);
+ QRectF boundingRect() const override;
+ void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override;
+
+private:
+ QPointer mMovie;
+ QMetaObject::Connection mConnection;
+};
+
+
+#endif // QGRAPHICSMOVIEITEM_H
diff --git a/QMyTableViewBtnDelegate.cpp b/QMyTableViewBtnDelegate.cpp
new file mode 100644
index 0000000..cd56fbc
--- /dev/null
+++ b/QMyTableViewBtnDelegate.cpp
@@ -0,0 +1,177 @@
+#include "qmytableviewbtndelegate.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+QMyTableViewBtnDelegate::QMyTableViewBtnDelegate(QStringList btnNames, QWidget *parent)
+ : QStyledItemDelegate(parent),
+ m_btnNames(btnNames)
+{
+}
+
+QMyTableViewBtnDelegate::~QMyTableViewBtnDelegate()
+{
+
+}
+
+// 绘制按钮
+void QMyTableViewBtnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+ QStyleOptionViewItem viewOption(option);
+ initStyleOption(&viewOption, index);
+ if (option.state.testFlag(QStyle::State_HasFocus))
+ viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
+
+ QStyledItemDelegate::paint(painter, viewOption, index);
+
+ // 计算按钮显示区域
+ int nCount = m_btnNames.count();
+
+ int w = nCount != 0 ? option.rect.width() / nCount : 0;
+ if(w < 0) {
+ return;
+ }
+
+ for (int i = 0; i < nCount; ++i)
+ {
+ // 绘制按钮
+ QStyleOptionButton button;
+ button.rect = option.rect.adjusted(1 + i*w , 1, -(w * ( nCount - i -1 ) + 1) , -1);
+ button.text = m_btnNames.at(i);
+ button.state |= QStyle::State_Enabled;
+
+ if (button.rect.contains(m_mousePoint))
+ {
+ if (m_nType == 0)
+ {
+ button.state |= QStyle::State_MouseOver;
+ }
+ else if (m_nType == 1)
+ {
+ button.state |= QStyle::State_Sunken;
+ }
+ }
+ QPushButton pushBtn;
+ //if (i == nCount - 1)
+ {
+ pushBtn.setStyleSheet("QPushButton{border-width: 0px;\
+ position: absolute;\
+ left: 0px;\
+ top: 0px;\
+ max-width: 80px;\
+ width:80px;\
+ height: 30px;\
+ background: inherit;\
+ background-color: rgba(255, 255, 255, 0);\
+ border-width: 1px;\
+ border-style: solid;\
+ border-color: red;\
+ border-radius: 10px;\
+ font-size: 11px;\
+ color: red;}\
+ QPushButton:hover{background-color:red; color:#FFFFFF;}");
+ }
+// else
+// {
+// pushBtn.setStyleSheet("QPushButton{border-width: 0px;\
+// position: absolute;\
+// left: 0px;\
+// top: 0px;\
+// max-width:120px; \
+// width:120px;\
+// height: 30px;\
+// background: inherit;\
+// background-color: rgba(255, 255, 255, 0);\
+// border-width: 1px;\
+// border-style: solid;\
+// border-color: rgba(2, 182, 212, 1);\
+// border-radius: 10px;\
+// font-size: 11px;\
+// color: #000000;}\
+// QPushButton:hover{background-color:rgba(2, 182, 212, 1); color:#FFFFFF;}");
+// }
+
+ pushBtn.style()->drawControl(QStyle::CE_PushButton, &button, painter, &pushBtn);
+ }
+}
+
+// 响应按钮事件 - 划过、按下
+bool QMyTableViewBtnDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index)
+{
+ m_nType = -1;
+ bool bRepaint = false;
+ QMouseEvent *pEvent = static_cast (event);
+ m_mousePoint = pEvent->pos();
+
+ int nCount = m_btnNames.count();
+
+ int w = nCount != 0 ? option.rect.width() / nCount : 0;
+ if(w < 0) {
+ return false;
+ }
+
+ // 还原鼠标样式
+ QApplication::restoreOverrideCursor();
+
+ for (int i = 0; i < nCount; ++i)
+ {
+ QStyleOptionButton button;
+ button.rect = option.rect.adjusted(1 + i*w , 1, -(w * ( nCount - i -1 ) + 1) , -1);
+
+ // 鼠标位于按钮之上
+ if (!button.rect.contains(m_mousePoint))
+ continue;
+
+ bRepaint = true;
+ switch (event->type())
+ {
+ // 鼠标滑过
+ case QEvent::MouseMove:
+ {
+ // 设置鼠标样式为手型
+ //QApplication::setOverrideCursor(Qt::PointingHandCursor);
+
+ m_nType = 0;
+
+ //QToolTip::showText(pEvent->globalPos(), m_btnNames.at(i));
+ break;
+ }
+ // 鼠标按下
+ case QEvent::MouseButtonPress:
+ {
+ m_nType = 1;
+ break;
+ }
+ // 鼠标释放
+ case QEvent::MouseButtonRelease:
+ {
+ switch (i)
+ {
+ case 0:
+ {
+ emit editData(index);
+ break;
+ }
+ case 1:
+ {
+ emit deleteData(index);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ default:
+ break;
+ }
+ }
+
+ return bRepaint;
+}
+
diff --git a/QMyTableViewBtnDelegate.h b/QMyTableViewBtnDelegate.h
new file mode 100644
index 0000000..4b89ca6
--- /dev/null
+++ b/QMyTableViewBtnDelegate.h
@@ -0,0 +1,30 @@
+#ifndef QMYTABLEVIEWBTNDELEGATE_H
+#define QMYTABLEVIEWBTNDELEGATE_H
+
+#include
+#include
+#include
+
+class QMyTableViewBtnDelegate: public QStyledItemDelegate
+{
+ Q_OBJECT
+
+public:
+ explicit QMyTableViewBtnDelegate(QStringList btnNames, QWidget *parent = 0);
+ ~QMyTableViewBtnDelegate();
+ void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+ bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index);
+
+signals:
+ void editData(const QModelIndex &index);
+ void deleteData(const QModelIndex &index);
+
+private:
+ QPoint m_mousePoint; // 鼠标位置
+ int m_nType; // 按钮状态:0-划过 1-按下
+ QStringList m_btnNames;
+};
+
+
+
+#endif // QMYTABLEVIEWBTNDELEGATE_H
diff --git a/RealTimeAlarm.cpp b/RealTimeAlarm.cpp
index ca6e75d..6b44068 100644
--- a/RealTimeAlarm.cpp
+++ b/RealTimeAlarm.cpp
@@ -1,11 +1,16 @@
#include "RealTimeAlarm.h"
#include "ui_RealTimeAlarm.h"
+#include
+#include "QMyTableViewBtnDelegate.h"
+#include "AlarmDetails.h"
+#include "sqlitedb.h"
CRealTimeAlarm::CRealTimeAlarm(QWidget *parent) :
QWidget(parent),
ui(new Ui::CRealTimeAlarm)
{
ui->setupUi(this);
+ ui->widget_alarm->setProperty("flag", "Button");
headerStr = QObject::tr("序号,报警级别,报警内容,报警时间,报警详情");
model = new QStandardItemModel(ui->tableView);
@@ -15,15 +20,61 @@ CRealTimeAlarm::CRealTimeAlarm(QWidget *parent) :
model->setColumnCount(headerList.size());
ui->tableView->setModel(model);
ui->tableView->setColumnWidth(2, 300);
+ ui->tableView->setColumnWidth(3, 300);
ui->tableView->setAlternatingRowColors(true);
- model->setRowCount(10);
+
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents);
ui->tableView->horizontalHeader()->setSectionResizeMode(4,QHeaderView::ResizeToContents);
+ // 必须要设置此项,否则样式表的hover无法生效
+ ui->tableView->setMouseTracking(true);
+
+ initTable();
+
}
CRealTimeAlarm::~CRealTimeAlarm()
{
delete ui;
}
+
+void CRealTimeAlarm::createRowItem(int Row,QVariantList RowItem)
+{
+ model->setRowCount(Row+1);
+ for (int j = 0; j < RowItem.size(); ++j)
+ {
+ model->setData(model->index(Row,j,QModelIndex()),RowItem.at(j));
+ }
+}
+void CRealTimeAlarm::initTable()
+{
+ QString strTableName = "t_TriggerEvent",strSql;
+ strSql = QString(" triggeredTime <> '' order by triggeredTime limit 0,10");
+ m_vecTriggerEvent = g_SqliteDB->GetTriggerEvent(strTableName,strSql);
+
+ if(m_vecTriggerEvent.size() > 0){
+ for (int i = 0; i < m_vecTriggerEvent.size(); i++) {
+ QVariantList strRowItem ;
+ QString TStr = QDateTime::fromSecsSinceEpoch(m_vecTriggerEvent[i].triggeredTime).toString("yyyy-MM-dd hh:mm:ss");
+ strRowItem << i + 1 << m_vecTriggerEvent[i].triggeredNotification << m_vecTriggerEvent[i].triggeredFeatureName << TStr;
+
+ createRowItem(i,strRowItem);
+ }
+ QMyTableViewBtnDelegate *m_btnDelegate = new QMyTableViewBtnDelegate(QStringList()<<"详情", this);
+ ui->tableView->setItemDelegateForColumn(4, m_btnDelegate);
+ connect(m_btnDelegate, SIGNAL(editData(const QModelIndex &)), this,SLOT(Details(const QModelIndex &)));
+
+ }else{
+ QMessageBox::information(this, "提示", QString("未查询到数据!"));
+ }
+}
+
+void CRealTimeAlarm::Details(const QModelIndex &index)
+{
+ int row = index.row();
+ CAlarmDetails *dialog = new CAlarmDetails();
+ dialog->ViewData(m_vecTriggerEvent[row]);
+ dialog->setWindowModality(Qt::ApplicationModal);
+ dialog->show();
+}
diff --git a/RealTimeAlarm.h b/RealTimeAlarm.h
index e18c4da..4ecc05d 100644
--- a/RealTimeAlarm.h
+++ b/RealTimeAlarm.h
@@ -3,7 +3,6 @@
#include
#include //数据模型类
-#include "HeaderView.h"
#include "TableHeaderView.h"
#include "global.h"
@@ -19,6 +18,9 @@ public:
explicit CRealTimeAlarm(QWidget *parent = nullptr);
~CRealTimeAlarm();
+private slots:
+ void Details(const QModelIndex &index);
+
private:
Ui::CRealTimeAlarm *ui;
@@ -26,6 +28,11 @@ private:
QStandardItemModel *model;
QString headerStr ;
+ QVector m_vecTriggerEvent;
+
+ void initTable();
+ void createRowItem(int Row,QVariantList RowItem);
+
};
#endif // REALTIMEALARM_H
diff --git a/RealTimeAlarm.ui b/RealTimeAlarm.ui
index e883f72..c72ff80 100644
--- a/RealTimeAlarm.ui
+++ b/RealTimeAlarm.ui
@@ -15,11 +15,15 @@
font: 16pt "黑体";
-color: rgb(27, 30, 35);
+color: rgb(27, 30, 35);
+
-
-
+
+
+
+
-
diff --git a/SystemSelfcheck.cpp b/SystemSelfcheck.cpp
index 1d60ed1..2f7b14d 100644
--- a/SystemSelfcheck.cpp
+++ b/SystemSelfcheck.cpp
@@ -1,5 +1,8 @@
#include "SystemSelfcheck.h"
#include "ui_SystemSelfcheck.h"
+#include "NetMgr.h"
+#include
+#include "global.h"
CSystemSelfcheck::CSystemSelfcheck(QWidget *parent) :
QWidget(parent),
@@ -14,8 +17,11 @@ CSystemSelfcheck::CSystemSelfcheck(QWidget *parent) :
"font-size:20px; color:#409CE1; font-weight:900;"));
m_centerLabel->hide();
+ //绑定HTTP消息响应
+ connect(g_NetMgr,SIGNAL(sigNetMgr(QString, const QVariant&)), this, SLOT(slotNetMgr(QString,const QVariant&)));
+
initPieChart();
- bulidPieChart(75);
+ bulidPieChart(0);
}
@@ -36,7 +42,191 @@ void CSystemSelfcheck::resizeEvent(QResizeEvent *event)
// ui->chartView->height() - m_bottomLabel->height() - 15);
}
+void CSystemSelfcheck::slotNetMgr(QString sAddr,const QVariant& msg)
+{
+ QJsonObject objec = msg.value();
+ if(!objec["success"].toBool()){
+ QString strMessage = objec["message"].toString();
+ if(strMessage.isEmpty())
+ QMessageBox::information(this, QStringLiteral("提示"), "连接失败!");
+ else
+ QMessageBox::information(this, QStringLiteral("提示"), strMessage);
+ return;
+ }
+ if(objec.contains("cmd")){
+ bulidPieChart(100);
+ ui->label_CPU->setText("正常");
+ ui->label_Power->setText("正常");
+ ui->label_CPU->setStyleSheet("color:green");
+ ui->label_Power->setStyleSheet("color:green");
+ QJsonValue arrays_value = objec.take("cmd");
+ qDebug()<<"cmd ="<label_Board1->setText("待检");
+ }
+ if(contentArray.at(0)["state"] == 1){
+ ui->label_Board1->setText("检验失败");
+ ui->label_Board1->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(0)["state"] == 2){
+ ui->label_Board1->setText("无板卡");
+ ui->label_Board1->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(0)["state"] == 3){
+ ui->label_Board1->setText("板卡正常");
+ ui->label_Board1->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(1)["state"] == 0){
+ ui->label_Board2->setText("待检");
+ }
+ if(contentArray.at(1)["state"] == 1){
+ ui->label_Board2->setText("检验失败");
+ ui->label_Board2->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(1)["state"] == 2){
+ ui->label_Board2->setText("无板卡");
+ ui->label_Board2->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(1)["state"] == 3){
+ ui->label_Board2->setText("板卡正常");
+ ui->label_Board2->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(2)["state"] == 0){
+ ui->label_Board3->setText("待检");
+ }
+ if(contentArray.at(2)["state"] == 1){
+ ui->label_Board3->setText("检验失败");
+ ui->label_Board3->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(2)["state"] == 2){
+ ui->label_Board3->setText("无板卡");
+ ui->label_Board3->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(2)["state"] == 3){
+ ui->label_Board3->setText("板卡正常");
+ ui->label_Board3->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(3)["state"] == 0){
+ ui->label_Board4->setText("待检");
+ }
+ if(contentArray.at(3)["state"] == 1){
+ ui->label_Board4->setText("检验失败");
+ ui->label_Board4->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(3)["state"] == 2){
+ ui->label_Board4->setText("无板卡");
+ ui->label_Board4->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(3)["state"] == 3){
+ ui->label_Board4->setText("板卡正常");
+ ui->label_Board4->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(4)["state"] == 0){
+ ui->label_Board5->setText("待检");
+ }
+ if(contentArray.at(4)["state"] == 1){
+ ui->label_Board5->setText("检验失败");
+ ui->label_Board5->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(4)["state"] == 2){
+ ui->label_Board5->setText("无板卡");
+ ui->label_Board5->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(4)["state"] == 3){
+ ui->label_Board5->setText("板卡正常");
+ ui->label_Board5->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(5)["state"] == 0){
+ ui->label_Board6->setText("待检");
+ }
+ if(contentArray.at(5)["state"] == 1){
+ ui->label_Board6->setText("检验失败");
+ ui->label_Board6->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(5)["state"] == 2){
+ ui->label_Board6->setText("无板卡");
+ ui->label_Board6->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(5)["state"] == 3){
+ ui->label_Board6->setText("板卡正常");
+ ui->label_Board6->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(6)["state"] == 0){
+ ui->label_Board7->setText("待检");
+ }
+ if(contentArray.at(6)["state"] == 1){
+ ui->label_Board7->setText("检验失败");
+ ui->label_Board7->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(6)["state"] == 2){
+ ui->label_Board7->setText("无板卡");
+ ui->label_Board7->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(6)["state"] == 3){
+ ui->label_Board7->setText("板卡正常");
+ ui->label_Board7->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(7)["state"] == 0){
+ ui->label_Board8->setText("待检");
+ }
+ if(contentArray.at(7)["state"] == 1){
+ ui->label_Board8->setText("检验失败");
+ ui->label_Board8->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(7)["state"] == 2){
+ ui->label_Board8->setText("无板卡");
+ ui->label_Board8->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(7)["state"] == 3){
+ ui->label_Board8->setText("板卡正常");
+ ui->label_Board8->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(8)["state"] == 0){
+ ui->label_Board9->setText("待检");
+ }
+ if(contentArray.at(8)["state"] == 1){
+ ui->label_Board9->setText("检验失败");
+ ui->label_Board9->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(8)["state"] == 2){
+ ui->label_Board9->setText("无板卡");
+ ui->label_Board9->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(8)["state"] == 3){
+ ui->label_Board9->setText("板卡正常");
+ ui->label_Board9->setStyleSheet("color:green");
+ }
+
+ if(contentArray.at(9)["state"] == 0){
+ ui->label_Board10->setText("待检");
+ }
+ if(contentArray.at(9)["state"] == 1){
+ ui->label_Board10->setText("检验失败");
+ ui->label_Board10->setStyleSheet("color:#ff0000");
+ }
+ if(contentArray.at(9)["state"] == 2){
+ ui->label_Board10->setText("无板卡");
+ ui->label_Board10->setStyleSheet("color:#ff9900");
+ }
+ if(contentArray.at(9)["state"] == 3){
+ ui->label_Board10->setText("板卡正常");
+ ui->label_Board10->setStyleSheet("color:green");
+ }
+
+ }
+ }
+}
void CSystemSelfcheck::initPieChart()
{
QChart *chart = new QChart();
@@ -77,3 +267,14 @@ void CSystemSelfcheck::bulidPieChart(int percent)
m_centerLabel->show();
resizeEvent(NULL);
}
+
+void CSystemSelfcheck::on_pushButton_check_clicked()
+{
+ QJsonObject allObj,cmdBody;
+ allObj.insert("cmd", "42");
+ QNetworkRequest req;
+ QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
+ req.setUrl(sUrl);
+ g_NetMgr->PostJson(req,allObj);
+}
+
diff --git a/SystemSelfcheck.h b/SystemSelfcheck.h
index e39d75e..3c181c3 100644
--- a/SystemSelfcheck.h
+++ b/SystemSelfcheck.h
@@ -23,7 +23,9 @@ private:
QChartView * m_ChartView;
QLabel * m_centerLabel;
-
+private slots:
+ //网络请求数据响应
+ void slotNetMgr(QString sAddr,const QVariant& msg);
void initPieChart();
@@ -31,6 +33,7 @@ private:
void resizeEvent(QResizeEvent *event);
+ void on_pushButton_check_clicked();
};
#endif // SYSTEMSELFCHECK_H
diff --git a/SystemSelfcheck.ui b/SystemSelfcheck.ui
index bc37bdc..17b48fc 100644
--- a/SystemSelfcheck.ui
+++ b/SystemSelfcheck.ui
@@ -146,7 +146,7 @@
-
-
+
待检
@@ -162,21 +162,21 @@
Qt::RightToLeft
- CPU自检状态:
+ CPU自检状态:
-
-
+
- 55
+ 0
0
- 55
+ 16777215
16777215
@@ -200,7 +200,7 @@
-
-
+
待检
@@ -218,7 +218,7 @@
-
-
+
待检
@@ -236,7 +236,7 @@
-
-
+
待检
@@ -254,7 +254,7 @@
-
-
+
待检
@@ -318,7 +318,7 @@
-
-
+
待检
@@ -336,7 +336,7 @@
-
-
+
待检
@@ -354,7 +354,7 @@
-
-
+
待检
@@ -372,7 +372,7 @@
-
-
+
待检
@@ -390,7 +390,7 @@
-
-
+
待检
@@ -408,7 +408,7 @@
-
-
+
待检
diff --git a/TerminalInfo.cpp b/TerminalInfo.cpp
index 1ed2ccc..3dbafb1 100644
--- a/TerminalInfo.cpp
+++ b/TerminalInfo.cpp
@@ -253,16 +253,37 @@ QChart * CTerminalInfo::bulidPieChart(int percent,QString& strTitle )
void CTerminalInfo::on_pushButton_Update_clicked()
{
- QString filepath = QFileDialog::getOpenFileName(this, tr("选择文件"), tr(""), tr("*.tar.gz"));
+ QStringList items;//ComboBox控件的内容
+ items<SetServerInfo(str);
g_FtpClient->SetUserInfo("root","@#cidw!@123456");
- g_FtpClient->UpLoadFile(filepath,FileName);
+ if(text == "系统")
+ curIndex = 0;
+ else if(text == "后端主程序")
+ curIndex = 1;
+ else if(text == "后端辅助程序")
+ curIndex = 2;
+ g_FtpClient->UpLoadFile(filepath,FileName,curIndex);
}
diff --git a/TerminalInfo.ui b/TerminalInfo.ui
index 17ed4bc..223bfc0 100644
--- a/TerminalInfo.ui
+++ b/TerminalInfo.ui
@@ -133,7 +133,7 @@
-
- color: rgb(0, 255, 0);
+ color: rgb(0, 170, 0);
在线
diff --git a/TrendGraph.cpp b/TrendGraph.cpp
index f2c33e7..0ad8427 100644
--- a/TrendGraph.cpp
+++ b/TrendGraph.cpp
@@ -1,14 +1,46 @@
#include "TrendGraph.h"
#include "ui_TrendGraph.h"
+#include
+#include "global.h"
CTrendGraph::CTrendGraph(QWidget *parent) :
QWidget(parent),
ui(new Ui::CTrendGraph)
{
ui->setupUi(this);
+
+ QDateTime curDateTime=QDateTime::currentDateTime();//通过QDateTime的currentDateTime获得当前的日期时间,并赋值给curDateTime
+ ui->dateTimeEdit_start->setDateTime(curDateTime);
+ ui->dateTimeEdit_end->setDateTime(curDateTime);
+
+ ui->comboBox_channel->setView(new QListView());
+
+ for (int i = 0; i < g_ChannelBaseInfo.size(); i++) {
+ ui->comboBox_channel->insertItem(i,g_ChannelBaseInfo[i].channelName);
+ }
+ connect(ui->comboBox_channel,SIGNAL(currentIndexChanged(const QString &)),this,SLOT(on_comboBox_channel_currentTextChanged(const QString&)));
+
}
CTrendGraph::~CTrendGraph()
{
delete ui;
}
+
+
+void CTrendGraph::on_comboBox_channel_currentTextChanged(const QString& strChannelName)
+{
+ int i = 0;
+ for (i = 0; i < g_ChannelBaseInfo.size(); i++) {
+ if(strChannelName == g_ChannelBaseInfo[i].channelName){
+ m_strChannelID = g_ChannelBaseInfo[i].channelID;
+ break;
+ }
+ }
+}
+
+void CTrendGraph::on_pushButton_search_clicked()
+{
+
+}
+
diff --git a/TrendGraph.h b/TrendGraph.h
index 4ed11a8..d0922eb 100644
--- a/TrendGraph.h
+++ b/TrendGraph.h
@@ -15,8 +15,14 @@ public:
explicit CTrendGraph(QWidget *parent = nullptr);
~CTrendGraph();
+private slots:
+ void on_pushButton_search_clicked();
+ void on_comboBox_channel_currentTextChanged(const QString&);
+
private:
Ui::CTrendGraph *ui;
+
+ QString m_strChannelID;
};
#endif // TRENDGRAPH_H
diff --git a/TrendGraph.ui b/TrendGraph.ui
index 1e81c04..bd2ae7b 100644
--- a/TrendGraph.ui
+++ b/TrendGraph.ui
@@ -6,7 +6,7 @@
0
0
- 1054
+ 1148
561
@@ -58,20 +58,7 @@ color: rgb(27, 30, 35);
-
-
-
-
- 150
- 0
-
-
-
-
- 150
- 16777215
-
-
-
+
@@ -85,23 +72,7 @@ color: rgb(27, 30, 35);
-
-
-
-
- 150
- 0
-
-
-
-
- 150
- 16777215
-
-
-
-
-
-
+
@@ -115,7 +86,7 @@ color: rgb(27, 30, 35);
-
-
+
230
@@ -146,7 +117,29 @@ color: rgb(27, 30, 35);
-
-
+
+
+
+ 120
+ 35
+
+
+
+
+ 120
+ 35
+
+
+
+ #pushButton_search { border-image: url(:/image/Btn/normal_Btn.png);
+ color:#1f5188 }
+#pushButton_search:hover { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_search:pressed { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+#pushButton_search:checked { border-image: url(:/image/Btn/normal_Btn_p.png);
+ color:#ffffff}
+
查询
diff --git a/TriggerConfig.cpp b/TriggerConfig.cpp
index 83dee30..7ca9880 100644
--- a/TriggerConfig.cpp
+++ b/TriggerConfig.cpp
@@ -110,6 +110,8 @@ void CTriggerConfig::LoadTriggerConfig(QString& strChannelID)
trgStatus.append("单次触发");
trgStatus.append("连续触发");
+
+
if(m_vecTriggerConfig.size() > 0){
model->setRowCount(m_vecTriggerConfig.size());
for (int i = 0; i < m_vecTriggerConfig.size(); i++) {
@@ -335,7 +337,7 @@ void CTriggerConfig::on_comboBox_channelConfig_currentTextChanged(const QString
}
- }else if(g_ChannelBaseInfo[ii].channelType =="SLOW_CURRENT"){
+ }else if(g_ChannelBaseInfo[ii].channelType =="SLOW_CURRENT" || g_ChannelBaseInfo[ii].channelType =="PULSE_CURRENT"){
LoadTriggerConfig(g_ChannelBaseInfo[ii].channelID);
if(m_vecTriggerConfig.size() < 1){
@@ -570,7 +572,7 @@ void CTriggerConfig::on_pushButton_save_clicked()
rowObj["triggerFeatureName"] = "MinValues";
else if(triggerConfig[j].Characteristic == "最大值")
rowObj["triggerFeatureName"] = "MaxValues";
- else if(triggerConfig[j].Characteristic == "平均值")
+ else if(triggerConfig[j].Characteristic == "平均值" || triggerConfig[j].Characteristic == "偏执电压")
rowObj["triggerFeatureName"] = "DCValues";
else if(triggerConfig[j].Characteristic == "有效值")
rowObj["triggerFeatureName"] = "RMSValues";
@@ -582,7 +584,7 @@ void CTriggerConfig::on_pushButton_save_clicked()
rowObj["triggerFeatureName"] = "IntegratPk2Pk";
else if(triggerConfig[j].Characteristic == "转速")
rowObj["triggerFeatureName"] = "SpeedProfileSpeed";
- else if(triggerConfig[j].Characteristic == "速度峰值")//积分
+ else if(triggerConfig[j].Characteristic == "速度峰值" || triggerConfig[j].Characteristic == "位移峰值")//积分
rowObj["triggerFeatureName"] = "IntegratPk2Pk/2";
else if(triggerConfig[j].Characteristic == "峰值")
rowObj["triggerFeatureName"] = "DiagnosisPeak";
@@ -629,6 +631,11 @@ void CTriggerConfig::on_pushButton_save_clicked()
file.write(jsonDoc.toJson());
file.close();
+ QVector().swap(m_WorkCondition);
+ QString wherecon = "";
+ wherecon = QString("Enable = \"1\" ");
+ m_WorkCondition = g_SqliteDB->GetWorkCondition("t_WorkCondition",wherecon);
+
QString str = QString("ftp://%1/CIDW/qtconfig/%2").arg(IP).arg("TriggerSettings.json");
g_FtpClient->SetServerInfo(str);
g_FtpClient->SetUserInfo("root","@#cidw!@123456");
diff --git a/UnitSetting.cpp b/UnitSetting.cpp
index 32eea19..5881c5b 100644
--- a/UnitSetting.cpp
+++ b/UnitSetting.cpp
@@ -250,6 +250,7 @@ void CUnitSetting::on_Btn_Confirm_clicked()
array.append("可逆式机组");
array.append("灯泡式机组");
array.append("冲击式机组");
+ array.append("贯流式机组");
tempObj["Options"] = array;
paramsObj.insert("UnitStyle",tempObj);
tempObj.remove("content");
@@ -277,7 +278,21 @@ void CUnitSetting::on_Btn_Confirm_clicked()
g_FtpClient->SetUserInfo("root","@#cidw!@123456");
g_FtpClient->UpLoadFile(fileName,"UnitParameters.json");
-
-
+}
+
+
+void CUnitSetting::on_UnitStyle_currentTextChanged(const QString &arg1)
+{
+ if(arg1 == "贯流式机组"){
+ ui->UpperGuideVaneWattage->setEnabled(false);
+ ui->LowerGuideVaneWattage->setEnabled(false);
+ ui->WaterGuideVaneWattage->setEnabled(false);
+ ui->ThrustWattage->setEnabled(false);
+ }else{
+ ui->UpperGuideVaneWattage->setEnabled(true);
+ ui->LowerGuideVaneWattage->setEnabled(true);
+ ui->WaterGuideVaneWattage->setEnabled(true);
+ ui->ThrustWattage->setEnabled(true);
+ }
}
diff --git a/UnitSetting.h b/UnitSetting.h
index 76552b3..9546956 100644
--- a/UnitSetting.h
+++ b/UnitSetting.h
@@ -18,6 +18,8 @@ public:
private slots:
void on_Btn_Confirm_clicked();
+ void on_UnitStyle_currentTextChanged(const QString &arg1);
+
private:
Ui::CUnitSetting *ui;
diff --git a/WaveDisplay.cpp b/WaveDisplay.cpp
index 61b9513..c948ee3 100644
--- a/WaveDisplay.cpp
+++ b/WaveDisplay.cpp
@@ -13,6 +13,8 @@ CWaveDisPlay::CWaveDisPlay(QWidget *parent) :
m_PackgNum = 1;
bFlag = false;
m_Times = 0;
+ m_Count = 0;
+ OneSecond = true;
ui->widget->setProperty("flag", "Title");
ui->widget_4->setProperty("flag", "normal");
// QAbstractItemView* view = ui->comboBox_channel_2->view();
@@ -101,6 +103,7 @@ void CWaveDisPlay::on_Btn_Hand_clicked()
if(ui->Btn_Hand->isChecked()){
//交互设置
ui->widget_wave->setInteractions(QCP::iRangeDrag | QCP::iSelectAxes | QCP::iSelectLegend | QCP::iMultiSelect);
+ ui->Btn_Zoom->setChecked(false);
}else if(!ui->Btn_Hand->isChecked()){
ui->widget_wave->setInteractions(QCP::iNone);
}
@@ -109,9 +112,15 @@ void CWaveDisPlay::on_Btn_Hand_clicked()
void CWaveDisPlay::on_Btn_Zoom_clicked()
{
- ui->widget_wave->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
- ui->widget_wave->selectionRect()->setPen(QPen(Qt::black,1,Qt::DashLine));//虚线
- ui->widget_wave->selectionRect()->setBrush(QBrush(QColor(255, 222, 173,50)));//NavajoWhite
+ if(ui->Btn_Zoom->isChecked()){
+ ui->Btn_Hand->setChecked(false);
+ ui->widget_wave->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
+ ui->widget_wave->selectionRect()->setPen(QPen(Qt::black,1,Qt::DashLine));//虚线
+ ui->widget_wave->selectionRect()->setBrush(QBrush(QColor(255, 222, 173,50)));//NavajoWhite
+ }
+ else if(!ui->Btn_Zoom->isChecked()){
+ ui->widget_wave->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
+ }
}
@@ -148,30 +157,83 @@ void CWaveDisPlay::ParseDataTimeWave(QJsonObject & objContent)
}
QString data = objContent["Data"].toString();
- m_WaveData = m_WaveData + data + ",";
- if(package + 1 == packageMax){
- qDebug() << "package" <widget_wave->xAxis->setRange(0, 1);
- ui->widget_wave->xAxis->setLabel("Time(s)");
- double gap = (double)1/(double)m_ListWaveData.size();
- double f = 0.0;
- QVector x,y;
- QCPGraph* graph = ui->widget_wave->addGraph(ui->widget_wave->xAxis, ui->widget_wave->yAxis);
- for(int i = 0; i < m_ListWaveData.size();i++){
- f += gap;
- x.push_back(f);
- y.push_back(m_ListWaveData[i].toDouble());
- }
- qDebug() << "x" <setData(x,y);
- ui->widget_wave->xAxis->setRange(0, 1);
- on_Btn_Scales_clicked();
- ui->widget_wave->replot();
+ if(package + 1 == packageMax){
+
+ if(!OneSecond){
+ m_Count ++;
+ m_WaveData = m_WaveData + data ;
+ qDebug() << "4S" <<"package" <widget_wave->xAxis->setRange(0, 4);
+ ui->widget_wave->xAxis->setLabel("Time(s)");
+ double gap = (double)4/(double)m_ListWaveData.size();
+ QVector x,y;
+ double f = 0.0;
+ QCPGraph* graph = ui->widget_wave->addGraph(ui->widget_wave->xAxis, ui->widget_wave->yAxis);
+ for(int i = 0; i < m_ListWaveData.size();i++){
+
+ x.push_back(f);
+ y.push_back(m_ListWaveData[i].toDouble());
+ f += gap;
+ }
+ qDebug() << "x" <setData(x,y);
+ ui->widget_wave->xAxis->setRange(0, 1);
+ on_Btn_Scales_clicked();
+ ui->widget_wave->replot();
+ m_ListWaveData.clear();
+ m_Count = 0;
+ }
+ m_WaveData = "";
+ }else {
+ m_WaveData = m_WaveData + data;
+ qDebug() << "package" <widget_wave->xAxis->setRange(0, 1);
+ ui->widget_wave->xAxis->setLabel("Time(s)");
+ double gap = (double)1/(double)m_ListWaveData.size();
+ double f = 0.0;
+ QVector x,y,x2,y2;
+ QCPGraph* graph = ui->widget_wave->addGraph(ui->widget_wave->xAxis, ui->widget_wave->yAxis);
+ for(int i = 0; i < m_ListWaveData.size();i++){
+ x.push_back(f);
+ y.push_back(m_ListWaveData[i].toDouble());
+ f += gap;
+ for(int j = 0; j < m_ListKeyPhaseData.size();j++){
+ if(m_ListKeyPhaseData[j].toInt() == i){
+ x2.push_back(f);
+ y2.push_back(m_ListWaveData[i].toDouble());
+ }
+ }
+ }
+ QCPGraph* dwPoints = new QCPGraph(ui->widget_wave->xAxis, ui->widget_wave->yAxis);
+ dwPoints->setAdaptiveSampling(false);
+ dwPoints->setLineStyle(QCPGraph::lsNone);
+ dwPoints->setScatterStyle(QCPScatterStyle::ssDot);
+ dwPoints->setPen(QPen(QBrush(Qt::red), 5));
+
+ dwPoints->addData(x2, y2);
+ QVector::iterator max = std::max_element(std::begin(y), std::end(y));
+ double biggest = *max;
+
+ qDebug() << "x" << x.size() << "y" << y.size() << endl;
+ qDebug() << "x2" << x2.size() << "y2" << y2.size() << endl;
+ graph->setData(x,y);
+ ui->widget_wave->xAxis->setRange(0, 1);
+ ui->widget_wave->yAxis->setRange(-1,biggest+2);
+ //on_Btn_Scales_clicked();
+ ui->widget_wave->replot();
+ }
+
+ }else{
+ m_WaveData = m_WaveData + data + ",";
}
}
@@ -218,9 +280,24 @@ void CWaveDisPlay::ParseDataFsWave(QJsonObject & objContent)
}
}
+void CWaveDisPlay::ParseDataKeyPhase(QJsonObject& objContent)
+{
+ QString data = objContent["Data"].toString();
+ m_ListKeyPhaseData = data.split(",");
+ qDebug() << "m_ListKeyPhaseData" << m_ListKeyPhaseData << endl;
+}
void CWaveDisPlay::slotNetMgr(QString sAddr, const QVariant &msg)
{
QJsonObject objec = msg.value();
+ if(!objec["success"].toBool()){
+ QString strMessage = objec["message"].toString();
+ if(strMessage.isEmpty())
+ QMessageBox::information(this, QStringLiteral("提示"), "连接失败!");
+ else
+ QMessageBox::information(this, QStringLiteral("提示"), strMessage);
+ return;
+ }
+
if(objec.contains("cmd"))
{
QJsonValue arrays_value = objec.take("cmd");
@@ -228,9 +305,12 @@ void CWaveDisPlay::slotNetMgr(QString sAddr, const QVariant &msg)
if(arrays_value.toString() == "30"){
QJsonObject objValue = objec["content"].toObject();
ParseDataTimeWave(objValue);
- } if(arrays_value.toString() == "32"){
+ }else if(arrays_value.toString() == "32"){
QJsonObject objValue = objec["content"].toObject();
ParseDataFsWave(objValue);
+ }else if(arrays_value.toString() == "92"){
+ QJsonObject objValue = objec["content"].toObject();
+ ParseDataKeyPhase(objValue);
}
}
}
@@ -263,11 +343,28 @@ void CWaveDisPlay::on_Btn_Timewave_clicked()
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
+
+ if(m_ChannelType == "TACHOMETER"){
+ QJsonObject allObj,cmdBody;
+ allObj.insert("cmd", "92");//获取键相
+ cmdBody.insert("package",0);
+ cmdBody.insert("channelId",m_ChannelID);
+ allObj["cmdBody"] = cmdBody;
+ QNetworkRequest req;
+ QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
+ req.setUrl(sUrl);
+ m_pNetMgr->PostJson(req,allObj);
+ }
}
void CWaveDisPlay::on_Btn_Fswave_clicked()
{
+ if(ui->pushButton_4S->isChecked()){
+ QMessageBox::information(this, QStringLiteral("提示"), "请切换到1S波形!");
+ ui->Btn_Fswave->setChecked(false);
+ return;
+ }
ui->Btn_Timewave->setChecked(false);
if(!ui->Btn_Fswave->isChecked()){
InitGraph();
@@ -297,10 +394,10 @@ void CWaveDisPlay::mouseMoveEvent(QMouseEvent *event)
//获得鼠标位置处对应的横坐标数据x
double x = ui->widget_wave->xAxis->pixelToCoord(event->pos().x());
//遍历曲线
- for (int i = 0; i < graphCount && tracer->visible(); ++i)
+ //for (int i = 0; i < graphCount && tracer->visible(); ++i)
{
//显示锚点
- QCPGraph *mGraph = ui->widget_wave->graph(i);
+ QCPGraph *mGraph = ui->widget_wave->graph(0);
tracer->setGraph(mGraph);//将锚点设置到被选中的曲线上
tracer->setGraphKey(x); //将游标横坐标设置成刚获得的横坐标数据x
tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效
@@ -309,7 +406,7 @@ void CWaveDisPlay::mouseMoveEvent(QMouseEvent *event)
tracerLabel->setVisible(true);
tracerLabel->setText(QString("X: %1 Y: %2").arg( QString::number(xValue)).arg(QString::number(yValue)));
//显示tip框
- QCPDataContainer::const_iterator coorPoint = ui->widget_wave->graph(i)->data().data()->findBegin(xValue, true);//true代表向左搜索
+ QCPDataContainer::const_iterator coorPoint = ui->widget_wave->graph(0)->data().data()->findBegin(xValue, true);//true代表向左搜索
}
//重绘
@@ -352,19 +449,44 @@ void CWaveDisPlay::on_comboBox_channel_2_currentTextChanged(const QString &arg1)
}
}
m_ChannelID = g_ChannelBaseInfo[i].channelID;
+ m_ChannelType = g_ChannelBaseInfo[i].channelType;
if(ui->Btn_Timewave->isChecked())
{
- QJsonObject allObj,cmdBody;
- allObj.insert("cmd", "30");
- cmdBody.insert("package",0);
- cmdBody.insert("channelId",m_ChannelID);
- allObj["cmdBody"] = cmdBody;
- QNetworkRequest req;
- QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
- req.setUrl(sUrl);
- m_pNetMgr->PostJson(req,allObj);
+ m_Times = 0;
+ if(ui->pushButton_4S->isChecked()){
+ OneSecond = false;
+
+ id1 = startTimer(1000); //参数1 间隔 单位 毫秒
+ //定时器第二种方式
+ QTimer * timer = new QTimer(this);
+ //启动定时器
+ timer->start(500);
+ }else if(ui->pushButton_1S->isChecked()){
+ OneSecond = true;
+ QJsonObject allObj,cmdBody;
+ allObj.insert("cmd", "30");
+ cmdBody.insert("package",0);
+ cmdBody.insert("channelId",m_ChannelID);
+ allObj["cmdBody"] = cmdBody;
+ QNetworkRequest req;
+ QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
+ req.setUrl(sUrl);
+ m_pNetMgr->PostJson(req,allObj);
+
+ if(m_ChannelType == "TACHOMETER"){
+ QJsonObject allObj,cmdBody;
+ allObj.insert("cmd", "92");//获取键相
+ cmdBody.insert("package",0);
+ cmdBody.insert("channelId",m_ChannelID);
+ allObj["cmdBody"] = cmdBody;
+ QNetworkRequest req;
+ QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
+ req.setUrl(sUrl);
+ m_pNetMgr->PostJson(req,allObj);
+ }
+ }
}
else if(ui->Btn_Fswave->isChecked())
{
@@ -395,6 +517,7 @@ void CWaveDisPlay::timerEvent(QTimerEvent *ev)
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
m_Times = m_Times + 1;
+ qDebug() << "m_Times" << m_Times << endl;
if(m_Times == 4){
killTimer(id1);
m_Times = 0;
@@ -405,9 +528,11 @@ void CWaveDisPlay::timerEvent(QTimerEvent *ev)
void CWaveDisPlay::on_pushButton_1S_clicked()
{
+ OneSecond = true;
ui->pushButton_4S->setChecked(false);
- if(!ui->pushButton_1S->isChecked()){
+ if(ui->pushButton_1S->isChecked()){
+ on_comboBox_channel_2_currentTextChanged("");
return;
}
}
@@ -415,14 +540,17 @@ void CWaveDisPlay::on_pushButton_1S_clicked()
void CWaveDisPlay::on_pushButton_4S_clicked()
{
+ if(ui->Btn_Fswave->isChecked()){
+ QMessageBox::information(this, QStringLiteral("提示"), "请切换到时域图!");
+ ui->pushButton_4S->setChecked(false);
+ return;
+ }
+ OneSecond = false;
+ m_Times = 0;
ui->pushButton_1S->setChecked(false);
if(ui->pushButton_4S->isChecked()){
- id1 = startTimer(1000); //参数1 间隔 单位 毫秒
- //定时器第二种方式
- QTimer * timer = new QTimer(this);
- //启动定时器
- timer->start(500);
+ on_comboBox_channel_2_currentTextChanged("");
return;
}
diff --git a/WaveDisplay.h b/WaveDisplay.h
index 6a718a3..dadf136 100644
--- a/WaveDisplay.h
+++ b/WaveDisplay.h
@@ -47,8 +47,10 @@ private:
Ui::CWaveDisPlay *ui;
NetMgr *m_pNetMgr; //HTTP消息类对象
QString m_ChannelID;
+ QString m_ChannelType;
QString m_WaveData;
QStringList m_ListWaveData;
+ QStringList m_ListKeyPhaseData;
QString m_FsWaveData;
int m_PackgNum;
bool bFlag;
@@ -57,9 +59,12 @@ private:
int id1; //定时器1的唯一标示
int m_Times;
+ int m_Count;
+ bool OneSecond;
void InitWindows();
void ParseDataTimeWave(QJsonObject&);
void ParseDataFsWave(QJsonObject&);
+ void ParseDataKeyPhase(QJsonObject&);
void InitGraph();
void Cursor();
diff --git a/WorkingCondition.cpp b/WorkingCondition.cpp
index dcad94a..68fc37b 100644
--- a/WorkingCondition.cpp
+++ b/WorkingCondition.cpp
@@ -11,7 +11,7 @@ CWorkingcondition::CWorkingcondition(QWidget *parent) :
ui->setupUi(this);
ui->widget_2->setProperty("flag","wcChannel");
ui->widget_3->setProperty("flag","normal");
- headerStr = QObject::tr("序号,工况名称,使能,起始工况,描述");
+ headerStr = QObject::tr("ID,工况名称,使能,起始工况,描述");
model = new QStandardItemModel(ui->tableView);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选中行
QStringList headerList = headerStr.split(",");
@@ -654,6 +654,7 @@ void CWorkingcondition::on_pushButton_del_clicked()
void CWorkingcondition::on_pushButton_save_clicked()
{
+ int flag = -1;
for (int i = 0; i < model->rowCount(); i++) {
QComboBox *gg = (QComboBox*)(ui->tableView->indexWidget(model->index(i,2)));
QRadioButton *radio = (QRadioButton*)(ui->tableView->indexWidget(model->index(i,3)));
@@ -672,6 +673,7 @@ void CWorkingcondition::on_pushButton_save_clicked()
if(radiocheck){
strStartWorkCondition = "1";
+ flag = 1;
}else if(!radiocheck){
strStartWorkCondition = "0";
@@ -682,7 +684,10 @@ void CWorkingcondition::on_pushButton_save_clicked()
g_SqliteDB->UpdateDataSql(strTablename,strSql);
}
-
+ if(flag == -1){
+ QMessageBox::information(this, QStringLiteral("提示"), "请选择起始工况!");
+ return;
+ }
QVector WorkCondition = g_SqliteDB->GetWorkCondition("t_WorkCondition","");
QJsonArray arrayWorkCondition;
@@ -690,7 +695,7 @@ void CWorkingcondition::on_pushButton_save_clicked()
QJsonObject tempObj;
qDebug() << "WorkCondition[i].CheckWorkConditionInterval.toInt()" << WorkCondition[i].CheckWorkConditionInterval.toInt() << endl;
tempObj["CheckWorkConditionInterval"] = WorkCondition[i].CheckWorkConditionInterval.toInt();
- tempObj["SN"] = WorkCondition[i].SN;
+ tempObj["SN"] = i + 1;
tempObj["Enable"] = WorkCondition[i].Enable;
if(WorkCondition[i].StartWorkCondition == "1")
tempObj["StartWorkCondition"] = true;
diff --git a/channelsetting.ui b/channelsetting.ui
index e107477..c664954 100644
--- a/channelsetting.ui
+++ b/channelsetting.ui
@@ -2601,7 +2601,7 @@ color: rgb(27, 30, 35);
-
-
+
0
diff --git a/ftpclient.cpp b/ftpclient.cpp
index 52f4da6..cf17745 100644
--- a/ftpclient.cpp
+++ b/ftpclient.cpp
@@ -14,6 +14,7 @@ FtpClient::FtpClient(QWidget *parent)
m_inputFile = NULL;
m_fileName = "";
+ m_Type = -1;
connect(m_ftpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
connect(g_NetMgr,SIGNAL(sigNetMgr(QString, const QVariant&)), this, SLOT(slotNetMgr(QString,const QVariant&)));
@@ -36,6 +37,7 @@ void FtpClient::SetServerInfo(const QString fileAddr, int Port/* =21 */)
m_ftpManager->disconnect(SIGNAL(finished(QNetworkReply*)));
connect(m_ftpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
+ //connect(m_ftpManager, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError)));
m_ftpUrl = new QUrl(fileAddr);
m_ftpUrl->setPort(Port);
@@ -53,9 +55,11 @@ void FtpClient::slotNetMgr(QString sAddr, const QVariant &msg)
bool Status = objec.take("success").toBool();
QString strMessage = objec.take("message").toString();
if(Status){
+ sigReplyStatus(1);
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
}else{
QMessageBox::information(this, QStringLiteral("提示"), strMessage);
+ sigReplyStatus(0);
}
}
}
@@ -64,20 +68,24 @@ void FtpClient::slotNetMgr(QString sAddr, const QVariant &msg)
void FtpClient::finished(QNetworkReply* reply)
{
+ QNetworkReply::NetworkError error = reply->error();
+ qDebug() << "finished" << error <= 0)
+ temp["content"] = m_Type;
tempArray.append(temp);
allObj.insert("cmdBody",tempArray);
+ }else{
+ allObj.insert("cmd", "46");
+ allObj.insert("type", m_Type);
+ temp["fileName"] = m_fileName;
+ allObj.insert("cmdBody",temp);
}
qDebug() << allObj << endl;
@@ -87,6 +95,7 @@ void FtpClient::finished(QNetworkReply* reply)
req.setUrl(sUrl);
g_NetMgr->PostJson(req,allObj);
m_fileName = "";
+ m_Type = -1;
//QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
}
@@ -128,13 +137,14 @@ void FtpClient::CheckReplyStatus(QNetworkReply::NetworkError inputError)
}
}
-void FtpClient::UpLoadFile(const QString fileSource, const QString fileName)
+void FtpClient::UpLoadFile(const QString fileSource, const QString fileName,int type)
{
if(fileSource.isEmpty())
{
return;
}
m_fileName = fileName;
+ m_Type = type;
QFile file(fileSource);
if(!file.exists())
{
@@ -146,9 +156,9 @@ void FtpClient::UpLoadFile(const QString fileSource, const QString fileName)
//QString result = QString::fromLatin1(fileDest.toStdString().c_str());
//m_ftpUrl->setPath(result);
QNetworkReply* reply = m_ftpManager->put(QNetworkRequest(*m_ftpUrl), data);
- connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError)));
+ //connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError)));
QEventLoop loop;
- connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
+ //connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
reply->deleteLater();
file.close();
diff --git a/ftpclient.h b/ftpclient.h
index 3043781..6e90fda 100644
--- a/ftpclient.h
+++ b/ftpclient.h
@@ -23,11 +23,13 @@ public:
//设置服务器地址和端口号
void SetServerInfo(const QString fileAddr, int Port=21);
//上传文件
- void UpLoadFile(const QString fileSource, const QString fileDest);
+ void UpLoadFile(const QString fileSource, const QString fileDest,int type = -1);
//下载文件
void DownLoad(const QString fileSource, const QString fileDest);
-private:
+
+signals:
+ void sigReplyStatus(int result);
public slots:
void CheckReplyStatus(QNetworkReply::NetworkError inputError);
@@ -39,6 +41,7 @@ private:
QFile* m_inputFile;
QNetworkAccessManager *m_ftpManager;
QUrl* m_ftpUrl;
+ int m_Type;
QString m_fileName;
};
diff --git a/global.h b/global.h
index 24e7a19..5e2e70d 100644
--- a/global.h
+++ b/global.h
@@ -213,6 +213,20 @@ typedef struct _TriggerConfig{
QString TriggerType;
} TriggerConfig_t;
+typedef struct _TriggerEvent{
+ QString triggeredChannelName;
+ QString triggeredType;
+ QString triggeredValue;
+ QString triggeredNotification;
+ QString triggeredDataWatchNo;
+ QString triggeredDataWatchName;
+ QString triggeredChannelID;
+ int triggeredTime;
+ int triggeredEquipmentID;
+ QString triggeredEventName;
+ QString triggeredFeatureName;
+}TriggerEvent_t ;
+
typedef struct _Charateristic{
double Amp1x;
double Phase1x;
diff --git a/image/unit/1.gif b/image/unit/1.gif
new file mode 100644
index 0000000..525d2ba
Binary files /dev/null and b/image/unit/1.gif differ
diff --git a/image/unit/1.png b/image/unit/1.png
new file mode 100644
index 0000000..4cc179f
Binary files /dev/null and b/image/unit/1.png differ
diff --git a/image/unit/dengpaoshi.png b/image/unit/dengpaoshi.png
new file mode 100644
index 0000000..eeb8224
Binary files /dev/null and b/image/unit/dengpaoshi.png differ
diff --git a/image/unit/gif.gif b/image/unit/gif.gif
new file mode 100644
index 0000000..6bed4d6
Binary files /dev/null and b/image/unit/gif.gif differ
diff --git a/image/unit/hunliushi.png b/image/unit/hunliushi.png
new file mode 100644
index 0000000..2ea278c
Binary files /dev/null and b/image/unit/hunliushi.png differ
diff --git a/image/unit/kenishi.png b/image/unit/kenishi.png
new file mode 100644
index 0000000..695f864
Binary files /dev/null and b/image/unit/kenishi.png differ
diff --git a/image/unit/zhouliushi.png b/image/unit/zhouliushi.png
new file mode 100644
index 0000000..76e78bd
Binary files /dev/null and b/image/unit/zhouliushi.png differ
diff --git a/include/mqtt/qmqtt.h b/include/mqtt/qmqtt.h
new file mode 100644
index 0000000..6e607dd
--- /dev/null
+++ b/include/mqtt/qmqtt.h
@@ -0,0 +1,38 @@
+/*
+ * qmqtt.h - qmqtt library heaer
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_H
+#define QMQTT_H
+
+#include
+#include
+
+#endif // QMQTT_H
diff --git a/include/mqtt/qmqtt_client.h b/include/mqtt/qmqtt_client.h
new file mode 100644
index 0000000..7474a64
--- /dev/null
+++ b/include/mqtt/qmqtt_client.h
@@ -0,0 +1,286 @@
+/*
+ * qmqtt_client.h - qmqtt client header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_CLIENT_H
+#define QMQTT_CLIENT_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifdef QT_WEBSOCKETS_LIB
+#include
+#endif // QT_WEBSOCKETS_LIB
+
+#ifndef QT_NO_SSL
+#include
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#endif // QT_NO_SSL
+
+#ifndef Q_ENUM_NS
+#define Q_ENUM_NS(x)
+#endif // Q_ENUM_NS
+
+namespace QMQTT {
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
+Q_MQTT_EXPORT Q_NAMESPACE
+#endif
+
+static const quint8 LIBRARY_VERSION_MAJOR = 0;
+static const quint8 LIBRARY_VERSION_MINOR = 3;
+static const quint8 LIBRARY_VERSION_REVISION = 1;
+//static const char* LIBRARY_VERSION = "0.3.1";
+
+enum MQTTVersion
+{
+ V3_1_0 = 3,
+ V3_1_1 = 4
+};
+Q_ENUM_NS(MQTTVersion)
+
+enum ConnectionState
+{
+ STATE_INIT = 0,
+ STATE_CONNECTING,
+ STATE_CONNECTED,
+ STATE_DISCONNECTED
+};
+Q_ENUM_NS(ConnectionState)
+
+enum ClientError
+{
+ UnknownError = 0,
+ SocketConnectionRefusedError,
+ SocketRemoteHostClosedError,
+ SocketHostNotFoundError,
+ SocketAccessError,
+ SocketResourceError,
+ SocketTimeoutError,
+ SocketDatagramTooLargeError,
+ SocketNetworkError,
+ SocketAddressInUseError,
+ SocketAddressNotAvailableError,
+ SocketUnsupportedSocketOperationError,
+ SocketUnfinishedSocketOperationError,
+ SocketProxyAuthenticationRequiredError,
+ SocketSslHandshakeFailedError,
+ SocketProxyConnectionRefusedError,
+ SocketProxyConnectionClosedError,
+ SocketProxyConnectionTimeoutError,
+ SocketProxyNotFoundError,
+ SocketProxyProtocolError,
+ SocketOperationError,
+ SocketSslInternalError,
+ SocketSslInvalidUserDataError,
+ SocketTemporaryError,
+ MqttUnacceptableProtocolVersionError=1<<16,
+ MqttIdentifierRejectedError,
+ MqttServerUnavailableError,
+ MqttBadUserNameOrPasswordError,
+ MqttNotAuthorizedError,
+ MqttNoPingResponse
+};
+Q_ENUM_NS(ClientError)
+
+class ClientPrivate;
+class Message;
+class Frame;
+class NetworkInterface;
+
+class Q_MQTT_EXPORT Client : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(quint16 _port READ port WRITE setPort)
+ Q_PROPERTY(QHostAddress _host READ host WRITE setHost)
+ Q_PROPERTY(QString _hostName READ hostName WRITE setHostName)
+ Q_PROPERTY(QString _clientId READ clientId WRITE setClientId)
+ Q_PROPERTY(QString _username READ username WRITE setUsername)
+ Q_PROPERTY(QByteArray _password READ password WRITE setPassword)
+ Q_PROPERTY(quint16 _keepAlive READ keepAlive WRITE setKeepAlive)
+ Q_PROPERTY(MQTTVersion _version READ version WRITE setVersion)
+ Q_PROPERTY(bool _autoReconnect READ autoReconnect WRITE setAutoReconnect)
+ Q_PROPERTY(int _autoReconnectInterval READ autoReconnectInterval WRITE setAutoReconnectInterval)
+ Q_PROPERTY(bool _cleanSession READ cleanSession WRITE setCleanSession)
+ Q_PROPERTY(QString _willTopic READ willTopic WRITE setWillTopic)
+ Q_PROPERTY(quint8 _willQos READ willQos WRITE setWillQos)
+ Q_PROPERTY(bool _willRetain READ willRetain WRITE setWillRetain)
+ Q_PROPERTY(QByteArray _willMessage READ willMessage WRITE setWillMessage)
+ Q_PROPERTY(ConnectionState _connectionState READ connectionState)
+#ifndef QT_NO_SSL
+ Q_PROPERTY(QSslConfiguration _sslConfiguration READ sslConfiguration WRITE setSslConfiguration)
+#endif // QT_NO_SSL
+
+public:
+ Client(const QHostAddress& host = QHostAddress::LocalHost,
+ const quint16 port = 1883,
+ QObject* parent = nullptr);
+
+#ifndef QT_NO_SSL
+ Client(const QString& hostName,
+ const quint16 port,
+ const QSslConfiguration& config,
+ const bool ignoreSelfSigned=false,
+ QObject* parent = nullptr);
+#endif // QT_NO_SSL
+
+ // This function is provided for backward compatibility with older versions of QMQTT.
+ // If the ssl parameter is true, this function will load a private key ('cert.key') and a local
+ // certificate ('cert.crt') from the current working directory. It will also set PeerVerifyMode
+ // to None. This may not be the safest way to set up an SSL connection.
+ Client(const QString& hostName,
+ const quint16 port,
+ const bool ssl,
+ const bool ignoreSelfSigned,
+ QObject* parent = nullptr);
+
+#ifdef QT_WEBSOCKETS_LIB
+ // Create a connection over websockets
+ Client(const QString& url,
+ const QString& origin,
+ QWebSocketProtocol::Version version,
+ bool ignoreSelfSigned = false,
+ QObject* parent = nullptr);
+
+#ifndef QT_NO_SSL
+ Client(const QString& url,
+ const QString& origin,
+ QWebSocketProtocol::Version version,
+ const QSslConfiguration& config,
+ const bool ignoreSelfSigned = false,
+ QObject* parent = nullptr);
+#endif // QT_NO_SSL
+#endif // QT_WEBSOCKETS_LIB
+
+ // for testing purposes only
+ Client(NetworkInterface* network,
+ const QHostAddress& host = QHostAddress::LocalHost,
+ const quint16 port = 1883,
+ QObject* parent = nullptr);
+
+ virtual ~Client();
+
+ QHostAddress host() const;
+ QString hostName() const;
+ quint16 port() const;
+ QString clientId() const;
+ QString username() const;
+ QByteArray password() const;
+ QMQTT::MQTTVersion version() const;
+ quint16 keepAlive() const;
+ bool cleanSession() const;
+ bool autoReconnect() const;
+ int autoReconnectInterval() const;
+ ConnectionState connectionState() const;
+ QString willTopic() const;
+ quint8 willQos() const;
+ bool willRetain() const;
+ QByteArray willMessage() const;
+
+ bool isConnectedToHost() const;
+#ifndef QT_NO_SSL
+ QSslConfiguration sslConfiguration() const;
+ void setSslConfiguration(const QSslConfiguration& config);
+#endif // QT_NO_SSL
+
+public Q_SLOTS:
+ void setHost(const QHostAddress& host);
+ void setHostName(const QString& hostName);
+ void setPort(const quint16 port);
+ void setClientId(const QString& clientId);
+ void setUsername(const QString& username);
+ void setPassword(const QByteArray& password);
+ void setVersion(const MQTTVersion version);
+ void setKeepAlive(const quint16 keepAlive);
+ void setCleanSession(const bool cleanSession);
+ void setAutoReconnect(const bool value);
+ void setAutoReconnectInterval(const int autoReconnectInterval);
+ void setWillTopic(const QString& willTopic);
+ void setWillQos(const quint8 willQos);
+ void setWillRetain(const bool willRetain);
+ void setWillMessage(const QByteArray& willMessage);
+
+ void connectToHost();
+ void disconnectFromHost();
+
+ void subscribe(const QString& topic, const quint8 qos = 0);
+ void unsubscribe(const QString& topic);
+
+ quint16 publish(const QMQTT::Message& message);
+
+#ifndef QT_NO_SSL
+ void ignoreSslErrors();
+ void ignoreSslErrors(const QList& errors);
+#endif // QT_NO_SSL
+
+Q_SIGNALS:
+ void connected();
+ void disconnected();
+ void error(const QMQTT::ClientError error);
+
+ void subscribed(const QString& topic, const quint8 qos = 0);
+ void unsubscribed(const QString& topic);
+ void published(const QMQTT::Message& message, quint16 msgid = 0);
+ void received(const QMQTT::Message& message);
+ void pingresp();
+#ifndef QT_NO_SSL
+ void sslErrors(const QList& errors);
+#endif // QT_NO_SSL
+
+protected Q_SLOTS:
+ void onNetworkConnected();
+ void onNetworkDisconnected();
+ void onNetworkReceived(const QMQTT::Frame& frame);
+ void onTimerPingReq();
+ void onPingTimeout();
+ void onNetworkError(QAbstractSocket::SocketError error);
+#ifndef QT_NO_SSL
+ void onSslErrors(const QList& errors);
+#endif // QT_NO_SSL
+
+protected:
+ QScopedPointer d_ptr;
+
+private:
+ Q_DISABLE_COPY(Client)
+ Q_DECLARE_PRIVATE(Client)
+};
+
+} // namespace QMQTT
+
+Q_DECLARE_METATYPE(QMQTT::ClientError)
+
+#endif // QMQTT_CLIENT_H
diff --git a/include/mqtt/qmqtt_client_p.h b/include/mqtt/qmqtt_client_p.h
new file mode 100644
index 0000000..72358db
--- /dev/null
+++ b/include/mqtt/qmqtt_client_p.h
@@ -0,0 +1,183 @@
+/*
+ * qmqtt_client_p.h - qmqtt client private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_CLIENT_P_H
+#define QMQTT_CLIENT_P_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifdef QT_WEBSOCKETS_LIB
+#include
+#endif // QT_WEBSOCKETS_LIB
+
+#ifndef QT_NO_SSL
+#include
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#endif // QT_NO_SSL
+
+namespace QMQTT {
+
+class NetworkInterface;
+
+class ClientPrivate
+{
+public:
+ ClientPrivate(Client* qq_ptr);
+ ~ClientPrivate();
+
+ void init(const QHostAddress& host, const quint16 port, NetworkInterface* network = nullptr);
+#ifndef QT_NO_SSL
+ void init(const QString& hostName, const quint16 port, const QSslConfiguration& config,
+ const bool ignoreSelfSigned=false);
+#endif // QT_NO_SSL
+ void init(const QString& hostName, const quint16 port, const bool ssl, const bool ignoreSelfSigned);
+#ifdef QT_WEBSOCKETS_LIB
+#ifndef QT_NO_SSL
+ void init(const QString& url,
+ const QString& origin,
+ QWebSocketProtocol::Version version,
+ const QSslConfiguration* sslConfig,
+ bool ignoreSelfSigned);
+#endif // QT_NO_SSL
+ void init(const QString& url,
+ const QString& origin,
+ QWebSocketProtocol::Version version);
+#endif // QT_WEBSOCKETS_LIB
+ void init(NetworkInterface* network);
+
+ QHostAddress _host;
+ QString _hostName;
+ quint16 _port;
+#ifdef QT_WEBSOCKETS_LIB
+ QWebSocketProtocol::Version _webSocketVersion;
+#endif // QT_WEBSOCKETS_LIB
+#ifndef QT_NO_SSL
+ bool _ignoreSelfSigned;
+#endif // QT_NO_SSL
+ quint16 _gmid;
+ MQTTVersion _version;
+ QString _clientId;
+ QString _username;
+ QByteArray _password;
+ bool _cleanSession;
+ ConnectionState _connectionState;
+ QScopedPointer _network;
+ QTimer _timer;
+ QTimer _pingResponseTimer;
+ QString _willTopic;
+ quint8 _willQos;
+ bool _willRetain;
+ QByteArray _willMessage;
+ QHash _midToTopic;
+ QHash _midToMessage;
+
+ Client* const q_ptr;
+
+ quint16 nextmid();
+ void connectToHost();
+ void sendConnect();
+ void onTimerPingReq();
+ void onPingTimeout();
+ quint16 sendUnsubscribe(const QString &topic);
+ quint16 sendSubscribe(const QString &topic, const quint8 qos);
+ quint16 sendPublish(const Message &message);
+ void sendPuback(const quint8 type, const quint16 mid);
+ void sendDisconnect();
+ void sendFrame(const Frame &frame);
+ void disconnectFromHost();
+ void stopKeepAlive();
+ void onNetworkConnected();
+ void onNetworkDisconnected();
+ quint16 publish(const Message& message);
+ void puback(const quint8 type, const quint16 msgid);
+ void subscribe(const QString& topic, const quint8 qos);
+ void unsubscribe(const QString& topic);
+ void onNetworkReceived(const QMQTT::Frame& frame);
+ void handleConnack(const quint8 ack);
+ void handlePublish(const Message& message);
+ void handlePuback(const quint8 type, const quint16 msgid);
+ void handleSuback(const QString& topic, const quint8 qos);
+ void handleUnsuback(const QString& topic);
+ void handlePingresp();
+ bool autoReconnect() const;
+ void setAutoReconnect(const bool autoReconnect);
+ int autoReconnectInterval() const;
+ void setAutoReconnectInterval(const int autoReconnectInterval);
+ bool isConnectedToHost() const;
+ QMQTT::ConnectionState connectionState() const;
+ void setCleanSession(const bool cleanSession);
+ bool cleanSession() const;
+ void setKeepAlive(const quint16 keepAlive);
+ quint16 keepAlive() const;
+ void setPassword(const QByteArray& password);
+ QByteArray password() const;
+ void setUsername(const QString& username);
+ QString username() const;
+ void setVersion(const MQTTVersion);
+ MQTTVersion version() const;
+ void setClientId(const QString& clientId);
+ QString clientId() const;
+ void setPort(const quint16 port);
+ quint16 port() const;
+ void setHost(const QHostAddress& host);
+ QHostAddress host() const;
+ void setHostName(const QString& hostName);
+ QString hostName() const;
+ void setWillTopic(const QString& willTopic);
+ void setWillQos(const quint8 willQos);
+ void setWillRetain(const bool willRetain);
+ void setWillMessage(const QByteArray& willMessage);
+ QString willTopic() const;
+ quint8 willQos() const;
+ bool willRetain() const;
+ QByteArray willMessage() const;
+ void onNetworkError(QAbstractSocket::SocketError error);
+#ifndef QT_NO_SSL
+ void ignoreSslErrors();
+ void ignoreSslErrors(const QList& errors);
+ QSslConfiguration sslConfiguration() const;
+ void setSslConfiguration(const QSslConfiguration& config);
+ void onSslErrors(const QList& errors);
+#endif // QT_NO_SSL
+
+ Q_DECLARE_PUBLIC(Client)
+};
+
+} // namespace QMQTT
+
+#endif // QMQTT_CLIENT_P_H
diff --git a/include/mqtt/qmqtt_frame.h b/include/mqtt/qmqtt_frame.h
new file mode 100644
index 0000000..2b629c3
--- /dev/null
+++ b/include/mqtt/qmqtt_frame.h
@@ -0,0 +1,137 @@
+/*
+ * qmqtt_frame.h - qmqtt frame heaer
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_FRAME_H
+#define QMQTT_FRAME_H
+
+#include
+
+#include
+#include
+#include
+
+QT_FORWARD_DECLARE_CLASS(QDataStream)
+
+#define PROTOCOL_MAGIC_3_1_0 "MQIsdp"
+#define PROTOCOL_MAGIC_3_1_1 "MQTT"
+
+#define RANDOM_CLIENT_PREFIX "QMQTT-"
+
+#define CONNECT 0x10
+#define CONNACK 0x20
+#define PUBLISH 0x30
+#define PUBACK 0x40
+#define PUBREC 0x50
+#define PUBREL 0x60
+#define PUBCOMP 0x70
+#define SUBSCRIBE 0x80
+#define SUBACK 0x90
+#define UNSUBSCRIBE 0xA0
+#define UNSUBACK 0xB0
+#define PINGREQ 0xC0
+#define PINGRESP 0xD0
+#define DISCONNECT 0xE0
+
+#define LSB(A) quint8(A & 0x00FF)
+#define MSB(A) quint8((A & 0xFF00) >> 8)
+
+/*
+|--------------------------------------
+| 7 6 5 4 | 3 | 2 1 | 0 |
+| Type | DUP flag | QoS | RETAIN |
+|--------------------------------------
+*/
+#define GETTYPE(HDR) (HDR & 0xF0)
+#define SETQOS(HDR, Q) (HDR | ((Q) << 1))
+#define GETQOS(HDR) ((HDR & 0x06) >> 1)
+#define SETDUP(HDR, D) (HDR | ((D) << 3))
+#define GETDUP(HDR) ((HDR & 0x08) >> 3)
+#define SETRETAIN(HDR, R) (HDR | (R))
+#define GETRETAIN(HDR) (HDR & 0x01)
+
+/*
+|----------------------------------------------------------------------------------
+| 7 | 6 | 5 | 4 3 | 2 | 1 | 0 |
+| username | password | willretain | willqos | willflag | cleansession | reserved |
+|----------------------------------------------------------------------------------
+*/
+#define FLAG_CLEANSESS(F, C) (F | ((C) << 1))
+#define FLAG_WILL(F, W) (F | ((W) << 2))
+#define FLAG_WILLQOS(F, Q) (F | ((Q) << 3))
+#define FLAG_WILLRETAIN(F, R) (F | ((R) << 5))
+#define FLAG_PASSWD(F, P) (F | ((P) << 6))
+#define FLAG_USERNAME(F, U) (F | ((U) << 7))
+
+namespace QMQTT {
+
+class Q_MQTT_EXPORT Frame
+{
+public:
+ explicit Frame();
+ explicit Frame(const quint8 header);
+ explicit Frame(const quint8 header, const QByteArray &data);
+ virtual ~Frame();
+
+ Frame(const Frame& other);
+ Frame& operator=(const Frame& other);
+
+ bool operator==(const Frame& other) const;
+ inline bool operator!=(const Frame& other) const
+ { return !operator==(other); }
+
+ quint8 header() const;
+ QByteArray data() const;
+
+ quint16 readInt();
+ quint8 readChar();
+ QByteArray readByteArray();
+ QString readString();
+
+ void writeInt(const quint16 i);
+ void writeChar(const quint8 c);
+ void writeByteArray(const QByteArray &data);
+ void writeString(const QString &string);
+ void writeRawData(const QByteArray &data);
+
+ //TODO: FIXME LATER
+ void write(QDataStream &stream) const;
+ bool encodeLength(QByteArray &lenbuf, int length) const;
+
+private:
+ quint8 _header;
+ QByteArray _data;
+};
+
+} // namespace QMQTT
+
+Q_DECLARE_METATYPE(QMQTT::Frame)
+
+#endif // QMQTT_FRAME_H
diff --git a/include/mqtt/qmqtt_global.h b/include/mqtt/qmqtt_global.h
new file mode 100644
index 0000000..b2f8bc2
--- /dev/null
+++ b/include/mqtt/qmqtt_global.h
@@ -0,0 +1,48 @@
+/*
+ * qmqtt_global.h - qmqtt libray global
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_GLOBAL_H
+#define QMQTT_GLOBAL_H
+
+#include
+
+#if !defined(QT_STATIC) && !defined(MQTT_PROJECT_INCLUDE_SRC)
+# if defined(QT_BUILD_QMQTT_LIB)
+# define Q_MQTT_EXPORT Q_DECL_EXPORT
+# else
+# define Q_MQTT_EXPORT Q_DECL_IMPORT
+# endif
+#else
+# define Q_MQTT_EXPORT
+#endif
+
+#endif // QMQTT_GLOBAL_H
+
diff --git a/include/mqtt/qmqtt_message.h b/include/mqtt/qmqtt_message.h
new file mode 100644
index 0000000..047841e
--- /dev/null
+++ b/include/mqtt/qmqtt_message.h
@@ -0,0 +1,96 @@
+/*
+ * qmqtt_message.h - qmqtt message header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_MESSAGE_H
+#define QMQTT_MESSAGE_H
+
+#include
+
+#include
+#include
+#include
+#include
+
+namespace QMQTT {
+
+class MessagePrivate;
+
+class Q_MQTT_EXPORT Message
+{
+public:
+ Message();
+ explicit Message(const quint16 id, const QString &topic, const QByteArray &payload,
+ const quint8 qos = 0, const bool retain = false, const bool dup = false);
+ Message(const Message &other);
+ ~Message();
+
+ Message &operator=(const Message &other);
+#ifdef Q_COMPILER_RVALUE_REFS
+ inline Message &operator=(Message &&other) Q_DECL_NOTHROW
+ { swap(other); return *this; }
+#endif
+
+ bool operator==(const Message &other) const;
+ inline bool operator!=(const Message &other) const
+ { return !operator==(other); }
+
+ inline void swap(Message &other) Q_DECL_NOTHROW
+ { qSwap(d, other.d); }
+
+ quint16 id() const;
+ void setId(const quint16 id);
+
+ quint8 qos() const;
+ void setQos(const quint8 qos);
+
+ bool retain() const;
+ void setRetain(const bool retain);
+
+ bool dup() const;
+ void setDup(const bool dup);
+
+ QString topic() const;
+ void setTopic(const QString &topic);
+
+ QByteArray payload() const;
+ void setPayload(const QByteArray &payload);
+
+private:
+ QSharedDataPointer d;
+};
+
+} // namespace QMQTT
+
+Q_DECLARE_SHARED(QMQTT::Message)
+
+Q_DECLARE_METATYPE(QMQTT::Message)
+
+#endif // QMQTT_MESSAGE_H
diff --git a/include/mqtt/qmqtt_message_p.h b/include/mqtt/qmqtt_message_p.h
new file mode 100644
index 0000000..148019c
--- /dev/null
+++ b/include/mqtt/qmqtt_message_p.h
@@ -0,0 +1,83 @@
+/*
+ * qmqtt_message.h - qmqtt message private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_MESSAGE_P_H
+#define QMQTT_MESSAGE_P_H
+
+#include
+#include
+#include
+
+namespace QMQTT {
+
+class MessagePrivate : public QSharedData
+{
+public:
+ inline MessagePrivate()
+ : QSharedData(),
+ id(0),
+ qos(0),
+ retain(false),
+ dup(false)
+ {}
+
+ inline MessagePrivate(const MessagePrivate &other)
+ : QSharedData(other),
+ id(other.id),
+ qos(other.qos),
+ retain(other.retain),
+ dup(other.dup),
+ topic(other.topic),
+ payload(other.payload)
+ {}
+
+ inline MessagePrivate(quint16 id, const QString &topic, const QByteArray &payload,
+ quint8 qos, bool retain, bool dup)
+ : QSharedData(),
+ id(id),
+ qos(qos),
+ retain(retain),
+ dup(dup),
+ topic(topic),
+ payload(payload)
+ {}
+
+ quint16 id;
+ quint8 qos : 2;
+ quint8 retain: 1;
+ quint8 dup: 1;
+ QString topic;
+ QByteArray payload;
+};
+
+} // namespace QMQTT
+
+#endif // QMQTT_MESSAGE_P_H
diff --git a/include/mqtt/qmqtt_network_p.h b/include/mqtt/qmqtt_network_p.h
new file mode 100644
index 0000000..6600197
--- /dev/null
+++ b/include/mqtt/qmqtt_network_p.h
@@ -0,0 +1,139 @@
+/*
+ * qmqtt_network_p.h - qmqtt network private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_NETWORK_P_H
+#define QMQTT_NETWORK_P_H
+
+#include
+
+#include
+#include
+#include
+#include
+
+#ifdef QT_WEBSOCKETS_LIB
+#include
+#endif // QT_WEBSOCKETS_LIB
+
+#ifndef QT_NO_SSL
+#include
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#endif // QT_NO_SSL
+
+namespace QMQTT {
+
+class SocketInterface;
+class TimerInterface;
+class Frame;
+
+class Network : public NetworkInterface
+{
+ Q_OBJECT
+
+public:
+ Network(QObject* parent = nullptr);
+#ifndef QT_NO_SSL
+ Network(const QSslConfiguration& config, QObject* parent = nullptr);
+#endif // QT_NO_SSL
+#ifdef QT_WEBSOCKETS_LIB
+#ifndef QT_NO_SSL
+ Network(const QString& origin,
+ QWebSocketProtocol::Version version,
+ const QSslConfiguration* sslConfig,
+ QObject* parent = nullptr);
+#endif // QT_NO_SSL
+ Network(const QString& origin,
+ QWebSocketProtocol::Version version,
+ QObject* parent = nullptr);
+#endif // QT_WEBSOCKETS_LIB
+ Network(SocketInterface* socketInterface, TimerInterface* timerInterface,
+ QObject* parent = nullptr);
+ ~Network();
+
+ void sendFrame(const Frame &frame);
+ bool isConnectedToHost() const;
+ bool autoReconnect() const;
+ void setAutoReconnect(const bool autoReconnect);
+ QAbstractSocket::SocketState state() const;
+ int autoReconnectInterval() const;
+ void setAutoReconnectInterval(const int autoReconnectInterval);
+#ifndef QT_NO_SSL
+ void ignoreSslErrors(const QList& errors);
+ QSslConfiguration sslConfiguration() const;
+ void setSslConfiguration(const QSslConfiguration& config);
+#endif // QT_NO_SSL
+
+public Q_SLOTS:
+ void connectToHost(const QHostAddress& host, const quint16 port);
+ void connectToHost(const QString& hostName, const quint16 port);
+ void disconnectFromHost();
+#ifndef QT_NO_SSL
+ void ignoreSslErrors();
+#endif // QT_NO_SSL
+
+protected Q_SLOTS:
+ void onSocketError(QAbstractSocket::SocketError socketError);
+
+protected:
+ void initialize();
+
+ quint16 _port;
+ QHostAddress _host;
+ QString _hostName;
+ bool _autoReconnect;
+ int _autoReconnectInterval;
+ SocketInterface* _socket;
+ TimerInterface* _autoReconnectTimer;
+
+ enum ReadState {
+ Header,
+ Length,
+ PayLoad
+ };
+
+ ReadState _readState;
+ quint8 _header;
+ int _length;
+ int _shift;
+ QByteArray _data;
+
+protected Q_SLOTS:
+ void onSocketReadReady();
+ void onDisconnected();
+ void connectToHost();
+
+private:
+ Q_DISABLE_COPY(Network)
+};
+
+} // namespace QMQTT
+
+#endif // QMQTT_NETWORK_P_H
diff --git a/include/mqtt/qmqtt_networkinterface.h b/include/mqtt/qmqtt_networkinterface.h
new file mode 100644
index 0000000..a431d6b
--- /dev/null
+++ b/include/mqtt/qmqtt_networkinterface.h
@@ -0,0 +1,92 @@
+/*
+ * qmqtt_networkinterface.h - qmqtt network interface header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_NETWORK_INTERFACE_H
+#define QMQTT_NETWORK_INTERFACE_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#ifndef QT_NO_SSL
+#include
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#endif // QT_NO_SSL
+
+namespace QMQTT {
+
+class Frame;
+
+class Q_MQTT_EXPORT NetworkInterface : public QObject
+{
+ Q_OBJECT
+public:
+ explicit NetworkInterface(QObject* parent = nullptr) : QObject(parent) {}
+ virtual ~NetworkInterface() {}
+
+ virtual void sendFrame(const Frame& frame) = 0;
+ virtual bool isConnectedToHost() const = 0;
+ virtual bool autoReconnect() const = 0;
+ virtual void setAutoReconnect(const bool autoReconnect) = 0;
+ virtual int autoReconnectInterval() const = 0;
+ virtual void setAutoReconnectInterval(const int autoReconnectInterval) = 0;
+ virtual QAbstractSocket::SocketState state() const = 0;
+#ifndef QT_NO_SSL
+ virtual void ignoreSslErrors(const QList& errors) = 0;
+ virtual QSslConfiguration sslConfiguration() const = 0;
+ virtual void setSslConfiguration(const QSslConfiguration& config) = 0;
+#endif // QT_NO_SSL
+
+public Q_SLOTS:
+ virtual void connectToHost(const QHostAddress& host, const quint16 port) = 0;
+ virtual void connectToHost(const QString& hostName, const quint16 port) = 0;
+ virtual void disconnectFromHost() = 0;
+#ifndef QT_NO_SSL
+ virtual void ignoreSslErrors() = 0;
+#endif // QT_NO_SSL
+
+Q_SIGNALS:
+ void connected();
+ void disconnected();
+ void received(const QMQTT::Frame& frame);
+ void error(QAbstractSocket::SocketError error);
+#ifndef QT_NO_SSL
+ void sslErrors(const QList& errors);
+#endif // QT_NO_SSL
+};
+
+} // namespace QMQTT
+
+#endif // QMQTT_NETWORK_INTERFACE_H
diff --git a/include/mqtt/qmqtt_routedmessage.h b/include/mqtt/qmqtt_routedmessage.h
new file mode 100644
index 0000000..b7e0473
--- /dev/null
+++ b/include/mqtt/qmqtt_routedmessage.h
@@ -0,0 +1,71 @@
+/*
+ * qmqtt_router.h - qmqtt router
+ *
+ * Copyright (c) 2013 Ery Lee
+ * Router added by Niklas Wulf
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_ROUTEDMESSAGE_H
+#define QMQTT_ROUTEDMESSAGE_H
+
+#include
+
+#include
+#include
+#include
+
+namespace QMQTT {
+
+class RouteSubscription;
+
+class Q_MQTT_EXPORT RoutedMessage
+{
+public:
+ inline RoutedMessage()
+ {}
+ inline RoutedMessage(const Message &message)
+ : _message(message)
+ {}
+
+ inline const Message &message() const
+ { return _message; }
+ inline QHash parameters() const
+ { return _parameters; }
+
+private:
+ friend class RouteSubscription;
+
+ Message _message;
+ QHash _parameters;
+};
+
+} // namespace QMQTT
+
+Q_DECLARE_METATYPE(QMQTT::RoutedMessage)
+
+#endif // QMQTT_ROUTEDMESSAGE_H
diff --git a/include/mqtt/qmqtt_router.h b/include/mqtt/qmqtt_router.h
new file mode 100644
index 0000000..35b04d7
--- /dev/null
+++ b/include/mqtt/qmqtt_router.h
@@ -0,0 +1,60 @@
+/*
+ * qmqtt_router.h - qmqtt router
+ *
+ * Copyright (c) 2013 Ery Lee
+ * Router added by Niklas Wulf
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_ROUTER_H
+#define QMQTT_ROUTER_H
+
+#include
+
+#include
+
+namespace QMQTT {
+
+class Client;
+class RouteSubscription;
+
+class Q_MQTT_EXPORT Router : public QObject
+{
+ Q_OBJECT
+public:
+ explicit Router(Client *parent = nullptr);
+
+ RouteSubscription *subscribe(const QString &route);
+ Client *client() const;
+
+private:
+ Client *_client;
+};
+
+} // namespace QMQTT
+
+#endif // QMQTT_ROUTER_H
diff --git a/include/mqtt/qmqtt_routesubscription.h b/include/mqtt/qmqtt_routesubscription.h
new file mode 100644
index 0000000..f3925ae
--- /dev/null
+++ b/include/mqtt/qmqtt_routesubscription.h
@@ -0,0 +1,79 @@
+/*
+ * qmqtt_router.h - qmqtt router
+ *
+ * Copyright (c) 2013 Ery Lee
+ * Router added by Niklas Wulf
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_ROUTESUBSCRIPTION_H
+#define QMQTT_ROUTESUBSCRIPTION_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+namespace QMQTT {
+
+class Client;
+class Message;
+class RoutedMessage;
+class Router;
+
+class Q_MQTT_EXPORT RouteSubscription : public QObject
+{
+ Q_OBJECT
+public:
+ ~RouteSubscription();
+
+ QString route() const;
+
+Q_SIGNALS:
+ void received(const RoutedMessage &message);
+
+private Q_SLOTS:
+ void routeMessage(const Message &message);
+
+private:
+ friend class Router;
+
+ explicit RouteSubscription(Router *parent = nullptr);
+ void setRoute(const QString &route);
+
+ QPointer _client;
+ QString _topic;
+ QRegularExpression _regularExpression;
+ QStringList _parameterNames;
+};
+
+} // namespace QMQTT
+
+#endif // QMQTT_ROUTESUBSCRIPTION_H
diff --git a/include/mqtt/qmqtt_socket_p.h b/include/mqtt/qmqtt_socket_p.h
new file mode 100644
index 0000000..cd971af
--- /dev/null
+++ b/include/mqtt/qmqtt_socket_p.h
@@ -0,0 +1,69 @@
+/*
+ * qmqtt_socket_p.h - qmqtt socket private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_SOCKET_P_H
+#define QMQTT_SOCKET_P_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+QT_FORWARD_DECLARE_CLASS(QIODevice)
+QT_FORWARD_DECLARE_CLASS(QTcpSocket)
+
+namespace QMQTT
+{
+
+class Socket : public SocketInterface
+{
+ Q_OBJECT
+public:
+ explicit Socket(QObject* parent = nullptr);
+ virtual ~Socket();
+
+ virtual QIODevice *ioDevice();
+ void connectToHost(const QHostAddress& address, quint16 port);
+ void connectToHost(const QString& hostName, quint16 port);
+ void disconnectFromHost();
+ QAbstractSocket::SocketState state() const;
+ QAbstractSocket::SocketError error() const;
+
+protected:
+ QScopedPointer _socket;
+};
+
+}
+
+#endif // QMQTT_SOCKET_P_H
diff --git a/include/mqtt/qmqtt_socketinterface.h b/include/mqtt/qmqtt_socketinterface.h
new file mode 100644
index 0000000..88257ef
--- /dev/null
+++ b/include/mqtt/qmqtt_socketinterface.h
@@ -0,0 +1,84 @@
+/*
+ * qmqtt_socketinterface.h - qmqtt socket interface header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_SOCKET_INTERFACE_H
+#define QMQTT_SOCKET_INTERFACE_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#ifndef QT_NO_SSL
+#include
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#endif // QT_NO_SSL
+
+QT_FORWARD_DECLARE_CLASS(QIODevice)
+
+namespace QMQTT
+{
+
+class Q_MQTT_EXPORT SocketInterface : public QObject
+{
+ Q_OBJECT
+public:
+ explicit SocketInterface(QObject* parent = nullptr) : QObject(parent) {}
+ virtual ~SocketInterface() {}
+
+ virtual QIODevice* ioDevice() = 0;
+ virtual void connectToHost(const QHostAddress& address, quint16 port) = 0;
+ virtual void connectToHost(const QString& hostName, quint16 port) = 0;
+ virtual void disconnectFromHost() = 0;
+ virtual QAbstractSocket::SocketState state() const = 0;
+ virtual QAbstractSocket::SocketError error() const = 0;
+#ifndef QT_NO_SSL
+ virtual void ignoreSslErrors(const QList& errors) { Q_UNUSED(errors); }
+ virtual void ignoreSslErrors() {}
+ virtual QSslConfiguration sslConfiguration() const { return QSslConfiguration(); }
+ virtual void setSslConfiguration(const QSslConfiguration& config) { Q_UNUSED(config); }
+#endif // QT_NO_SSL
+
+Q_SIGNALS:
+ void connected();
+ void disconnected();
+ void error(QAbstractSocket::SocketError socketError);
+#ifndef QT_NO_SSL
+ void sslErrors(const QList& errors);
+#endif // QT_NO_SSL
+};
+
+}
+
+#endif // QMQTT_SOCKET_INTERFACE_H
diff --git a/include/mqtt/qmqtt_ssl_socket_p.h b/include/mqtt/qmqtt_ssl_socket_p.h
new file mode 100644
index 0000000..45fbc7c
--- /dev/null
+++ b/include/mqtt/qmqtt_ssl_socket_p.h
@@ -0,0 +1,79 @@
+/*
+ * qmqtt_ssl_socket_p.h - qmqtt SSL socket private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * Copyright (c) 2016 Matthias Dieter Wallnöfer
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_SSL_SOCKET_P_H
+#define QMQTT_SSL_SOCKET_P_H
+
+#ifndef QT_NO_SSL
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+QT_FORWARD_DECLARE_CLASS(QSslSocket)
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#include
+
+namespace QMQTT
+{
+
+class SslSocket : public SocketInterface
+{
+ Q_OBJECT
+public:
+ explicit SslSocket(const QSslConfiguration& config, QObject* parent = nullptr);
+ virtual ~SslSocket();
+
+ virtual QIODevice *ioDevice();
+ void connectToHost(const QHostAddress& address, quint16 port);
+ void connectToHost(const QString& hostName, quint16 port);
+ void disconnectFromHost();
+ QAbstractSocket::SocketState state() const;
+ QAbstractSocket::SocketError error() const;
+ void ignoreSslErrors(const QList& errors);
+ void ignoreSslErrors();
+ QSslConfiguration sslConfiguration() const;
+ void setSslConfiguration(const QSslConfiguration& config);
+
+protected:
+ QScopedPointer _socket;
+};
+
+}
+
+#endif // QT_NO_SSL
+
+#endif // QMQTT_SSL_SOCKET_P_H
diff --git a/include/mqtt/qmqtt_timer_p.h b/include/mqtt/qmqtt_timer_p.h
new file mode 100644
index 0000000..699008e
--- /dev/null
+++ b/include/mqtt/qmqtt_timer_p.h
@@ -0,0 +1,62 @@
+/*
+ * qmqtt_timer_p.h - qmqtt timer private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_TIMER_P_H
+#define QMQTT_TIMER_P_H
+
+#include
+
+#include
+#include
+
+namespace QMQTT {
+
+class Timer : public TimerInterface
+{
+ Q_OBJECT
+public:
+ explicit Timer(QObject *parent = nullptr);
+ virtual ~Timer();
+
+ bool isSingleShot() const;
+ void setSingleShot(bool singleShot);
+ int interval() const;
+ void setInterval(int msec);
+ void start();
+ void stop();
+
+protected:
+ QTimer _timer;
+};
+
+}
+
+#endif // QMQTT_TIMER_P_H
diff --git a/include/mqtt/qmqtt_timerinterface.h b/include/mqtt/qmqtt_timerinterface.h
new file mode 100644
index 0000000..2d87415
--- /dev/null
+++ b/include/mqtt/qmqtt_timerinterface.h
@@ -0,0 +1,62 @@
+/*
+ * qmqtt_timerinterface.h - qmqtt timer interface header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_TIMER_INTERFACE_H
+#define QMQTT_TIMER_INTERFACE_H
+
+#include
+
+#include
+
+namespace QMQTT {
+
+class Q_MQTT_EXPORT TimerInterface : public QObject
+{
+ Q_OBJECT
+public:
+ explicit TimerInterface(QObject* parent = nullptr) : QObject(parent) {}
+ virtual ~TimerInterface() {}
+
+ virtual bool isSingleShot() const = 0;
+ virtual void setSingleShot(bool singleShot) = 0;
+ virtual int interval() const = 0;
+ virtual void setInterval(int msec) = 0;
+ virtual void start() = 0;
+ virtual void stop() = 0;
+
+Q_SIGNALS:
+ void timeout();
+};
+
+}
+
+#endif // QMQTT_TIMER_INTERFACE_H
+
diff --git a/include/mqtt/qmqtt_websocket_p.h b/include/mqtt/qmqtt_websocket_p.h
new file mode 100644
index 0000000..ca77363
--- /dev/null
+++ b/include/mqtt/qmqtt_websocket_p.h
@@ -0,0 +1,102 @@
+/*
+ * qmqtt_websocket_p.h - qmqtt socket private header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef QMQTT_WEBSOCKET_H
+#define QMQTT_WEBSOCKET_H
+
+#ifdef QT_WEBSOCKETS_LIB
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+QT_FORWARD_DECLARE_CLASS(QIODevice)
+
+#ifndef QT_NO_SSL
+#include
+QT_FORWARD_DECLARE_CLASS(QSslError)
+#endif // QT_NO_SSL
+
+namespace QMQTT
+{
+
+class WebSocket : public SocketInterface
+{
+ Q_OBJECT
+public:
+#ifndef QT_NO_SSL
+ WebSocket(const QString& origin,
+ QWebSocketProtocol::Version version,
+ const QSslConfiguration* sslConfig,
+ QObject* parent = nullptr);
+#endif // QT_NO_SSL
+
+ WebSocket(const QString& origin,
+ QWebSocketProtocol::Version version,
+ QObject* parent = nullptr);
+
+ virtual ~WebSocket();
+
+ QIODevice *ioDevice()
+ {
+ return _ioDevice;
+ }
+
+ void connectToHost(const QHostAddress& address, quint16 port);
+ void connectToHost(const QString& hostName, quint16 port);
+ void disconnectFromHost();
+ QAbstractSocket::SocketState state() const;
+ QAbstractSocket::SocketError error() const;
+#ifndef QT_NO_SSL
+ void ignoreSslErrors(const QList& errors);
+ void ignoreSslErrors();
+ QSslConfiguration sslConfiguration() const;
+ void setSslConfiguration(const QSslConfiguration& config);
+#endif // QT_NO_SSL
+
+private:
+ void initialize();
+
+ QWebSocket *_socket;
+ WebSocketIODevice *_ioDevice;
+};
+
+}
+
+#endif // QT_WEBSOCKETS_LIB
+
+#endif // QMQTT_WEBSOCKET_H
diff --git a/include/mqtt/qmqtt_websocketiodevice_p.h b/include/mqtt/qmqtt_websocketiodevice_p.h
new file mode 100644
index 0000000..41d35b2
--- /dev/null
+++ b/include/mqtt/qmqtt_websocketiodevice_p.h
@@ -0,0 +1,74 @@
+/*
+ * qmqtt_socketinterface.h - qmqtt socket interface header
+ *
+ * Copyright (c) 2013 Ery Lee
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of mqttc nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef QMQTT_WEBSOCKETIODEVICE_H
+#define QMQTT_WEBSOCKETIODEVICE_H
+
+#ifdef QT_WEBSOCKETS_LIB
+
+#include
+#include
+
+QT_FORWARD_DECLARE_CLASS(QWebSocket)
+QT_FORWARD_DECLARE_CLASS(QNetworkRequest)
+
+namespace QMQTT
+{
+
+class WebSocketIODevice : public QIODevice
+{
+ Q_OBJECT
+public:
+ explicit WebSocketIODevice(QWebSocket *socket, QObject *parent = nullptr);
+
+ bool connectToHost(const QNetworkRequest &request);
+
+ virtual qint64 bytesAvailable() const;
+
+protected:
+ virtual qint64 readData(char *data, qint64 maxSize);
+
+ virtual qint64 writeData(const char *data, qint64 maxSize);
+
+private Q_SLOTS:
+ void binaryMessageReceived(const QByteArray &frame);
+
+private:
+ QByteArray _buffer;
+ QWebSocket *_webSocket;
+};
+
+}
+
+#endif // QT_WEBSOCKETS_LIB
+
+#endif // QMQTT_WEBSOCKETIODEVICE_H
diff --git a/lib/mqtt/Qt5Qmqtt.prl b/lib/mqtt/Qt5Qmqtt.prl
new file mode 100644
index 0000000..51a31d9
--- /dev/null
+++ b/lib/mqtt/Qt5Qmqtt.prl
@@ -0,0 +1,5 @@
+QMAKE_PRL_BUILD_DIR = E:/ThunderDownload/build-qmqtt-Desktop_Qt_5_12_11_MinGW_32_bit-Release/src/mqtt
+QMAKE_PRO_INPUT = qmqtt.pro
+QMAKE_PRL_TARGET = libQt5Qmqtt.a
+QMAKE_PRL_CONFIG = lex yacc depend_includepath testcase_targets import_plugins import_qpa_plugin windows qt_build_extra file_copies qmake_use qt warn_on release link_prl debug_and_release precompile_header shared release no_plugin_manifest win32 mingw gcc copy_dir_files sse2 aesni sse3 ssse3 sse4_1 sse4_2 avx avx2 avx512f avx512bw avx512cd avx512dq avx512er avx512ifma avx512pf avx512vbmi avx512vl compile_examples f16c largefile optimize_debug precompile_header rdrnd shani x86SimdAlways prefix_build force_independent utf8_source create_prl link_prl prepare_docs qt_docs_targets no_private_qt_headers_warning QTDIR_build qt_example_installs exceptions_off testcase_exceptions warning_clean release ReleaseBuild Release build_pass qtquickcompiler release ReleaseBuild Release build_pass relative_qt_rpath qmake_cache target_qt c++11 strict_c++ c++14 c++1z c99 c11 split_incpath qt_install_headers need_fwd_pri qt_install_module debug_and_release build_all create_cmake skip_target_version_ext compiler_supports_fpmath create_pc release ReleaseBuild Release build_pass have_target dll exclusive_builds no_autoqmake thread moc resources
+QMAKE_PRL_VERSION = 1.0.2
diff --git a/lib/mqtt/Qt5Qmqttd.prl b/lib/mqtt/Qt5Qmqttd.prl
new file mode 100644
index 0000000..e494d00
--- /dev/null
+++ b/lib/mqtt/Qt5Qmqttd.prl
@@ -0,0 +1,5 @@
+QMAKE_PRL_BUILD_DIR = E:/ThunderDownload/build-qmqtt-Desktop_Qt_5_12_11_MinGW_32_bit-Release/src/mqtt
+QMAKE_PRO_INPUT = qmqtt.pro
+QMAKE_PRL_TARGET = libQt5Qmqttd.a
+QMAKE_PRL_CONFIG = lex yacc debug depend_includepath testcase_targets import_plugins import_qpa_plugin windows qt_build_extra file_copies qmake_use qt warn_on link_prl debug_and_release precompile_header shared no_plugin_manifest win32 mingw gcc copy_dir_files sse2 aesni sse3 ssse3 sse4_1 sse4_2 avx avx2 avx512f avx512bw avx512cd avx512dq avx512er avx512ifma avx512pf avx512vbmi avx512vl compile_examples f16c largefile optimize_debug precompile_header rdrnd shani x86SimdAlways prefix_build force_independent utf8_source create_prl link_prl prepare_docs qt_docs_targets no_private_qt_headers_warning QTDIR_build qt_example_installs exceptions_off testcase_exceptions warning_clean debug DebugBuild Debug build_pass qtquickcompiler debug DebugBuild Debug build_pass relative_qt_rpath qmake_cache target_qt c++11 strict_c++ c++14 c++1z c99 c11 split_incpath qt_install_headers need_fwd_pri qt_install_module debug_and_release build_all create_cmake skip_target_version_ext compiler_supports_fpmath create_pc debug DebugBuild Debug build_pass have_target dll no_plist exclusive_builds debug_info no_autoqmake thread moc resources
+QMAKE_PRL_VERSION = 1.0.2
diff --git a/lib/mqtt/cmake/Qt5Qmqtt/ExtraSourceIncludes.cmake b/lib/mqtt/cmake/Qt5Qmqtt/ExtraSourceIncludes.cmake
new file mode 100644
index 0000000..8f1e72c
--- /dev/null
+++ b/lib/mqtt/cmake/Qt5Qmqtt/ExtraSourceIncludes.cmake
@@ -0,0 +1,7 @@
+
+list(APPEND _Qt5Qmqtt_OWN_INCLUDE_DIRS
+ "E:/ThunderDownload/qmqtt-master/include" "E:/ThunderDownload/qmqtt-master/include/QtQmqtt"
+)
+set(Qt5Qmqtt_PRIVATE_INCLUDE_DIRS
+ "E:/ThunderDownload/qmqtt-master/include/QtQmqtt/1.0.2" "E:/ThunderDownload/qmqtt-master/include/QtQmqtt/1.0.2/QtQmqtt"
+)
diff --git a/lib/mqtt/cmake/Qt5Qmqtt/Qt5QmqttConfig.cmake b/lib/mqtt/cmake/Qt5Qmqtt/Qt5QmqttConfig.cmake
new file mode 100644
index 0000000..a1b5dee
--- /dev/null
+++ b/lib/mqtt/cmake/Qt5Qmqtt/Qt5QmqttConfig.cmake
@@ -0,0 +1,185 @@
+
+if (CMAKE_VERSION VERSION_LESS 3.1.0)
+ message(FATAL_ERROR "Qt 5 Qmqtt module requires at least CMake version 3.1.0")
+endif()
+
+get_filename_component(_qt5Qmqtt_install_prefix "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
+
+# For backwards compatibility only. Use Qt5Qmqtt_VERSION instead.
+set(Qt5Qmqtt_VERSION_STRING 1.0.2)
+
+set(Qt5Qmqtt_LIBRARIES Qt5::Qmqtt)
+
+macro(_qt5_Qmqtt_check_file_exists file)
+ if(NOT EXISTS "${file}" )
+ message(FATAL_ERROR "The imported target \"Qt5::Qmqtt\" references the file
+ \"${file}\"
+but this file does not exist. Possible reasons include:
+* The file was deleted, renamed, or moved to another location.
+* An install or uninstall procedure did not complete successfully.
+* The installation package was faulty and contained
+ \"${CMAKE_CURRENT_LIST_FILE}\"
+but not all the files it references.
+")
+ endif()
+endmacro()
+
+macro(_populate_Qmqtt_target_properties Configuration LIB_LOCATION IMPLIB_LOCATION)
+ set_property(TARGET Qt5::Qmqtt APPEND PROPERTY IMPORTED_CONFIGURATIONS ${Configuration})
+
+ set(imported_location "${_qt5Qmqtt_install_prefix}/bin/${LIB_LOCATION}")
+ _qt5_Qmqtt_check_file_exists(${imported_location})
+ set_target_properties(Qt5::Qmqtt PROPERTIES
+ "INTERFACE_LINK_LIBRARIES" "${_Qt5Qmqtt_LIB_DEPENDENCIES}"
+ "IMPORTED_LOCATION_${Configuration}" ${imported_location}
+ # For backward compatibility with CMake < 2.8.12
+ "IMPORTED_LINK_INTERFACE_LIBRARIES_${Configuration}" "${_Qt5Qmqtt_LIB_DEPENDENCIES}"
+ )
+
+ set(imported_implib "${_qt5Qmqtt_install_prefix}/lib/${IMPLIB_LOCATION}")
+ _qt5_Qmqtt_check_file_exists(${imported_implib})
+ if(NOT "${IMPLIB_LOCATION}" STREQUAL "")
+ set_target_properties(Qt5::Qmqtt PROPERTIES
+ "IMPORTED_IMPLIB_${Configuration}" ${imported_implib}
+ )
+ endif()
+endmacro()
+
+if (NOT TARGET Qt5::Qmqtt)
+
+ set(_Qt5Qmqtt_OWN_INCLUDE_DIRS "${_qt5Qmqtt_install_prefix}/include/" "${_qt5Qmqtt_install_prefix}/include/QtQmqtt")
+ set(Qt5Qmqtt_PRIVATE_INCLUDE_DIRS "")
+ include("${CMAKE_CURRENT_LIST_DIR}/ExtraSourceIncludes.cmake" OPTIONAL)
+
+ foreach(_dir ${_Qt5Qmqtt_OWN_INCLUDE_DIRS})
+ _qt5_Qmqtt_check_file_exists(${_dir})
+ endforeach()
+
+ # Only check existence of private includes if the Private component is
+ # specified.
+ list(FIND Qt5Qmqtt_FIND_COMPONENTS Private _check_private)
+ if (NOT _check_private STREQUAL -1)
+ foreach(_dir ${Qt5Qmqtt_PRIVATE_INCLUDE_DIRS})
+ _qt5_Qmqtt_check_file_exists(${_dir})
+ endforeach()
+ endif()
+
+ set(Qt5Qmqtt_INCLUDE_DIRS ${_Qt5Qmqtt_OWN_INCLUDE_DIRS})
+
+ set(Qt5Qmqtt_DEFINITIONS -DQT_QMQTT_LIB)
+ set(Qt5Qmqtt_COMPILE_DEFINITIONS QT_QMQTT_LIB)
+ set(_Qt5Qmqtt_MODULE_DEPENDENCIES "Network;Core")
+
+
+ set(Qt5Qmqtt_OWN_PRIVATE_INCLUDE_DIRS ${Qt5Qmqtt_PRIVATE_INCLUDE_DIRS})
+
+ set(_Qt5Qmqtt_FIND_DEPENDENCIES_REQUIRED)
+ if (Qt5Qmqtt_FIND_REQUIRED)
+ set(_Qt5Qmqtt_FIND_DEPENDENCIES_REQUIRED REQUIRED)
+ endif()
+ set(_Qt5Qmqtt_FIND_DEPENDENCIES_QUIET)
+ if (Qt5Qmqtt_FIND_QUIETLY)
+ set(_Qt5Qmqtt_DEPENDENCIES_FIND_QUIET QUIET)
+ endif()
+ set(_Qt5Qmqtt_FIND_VERSION_EXACT)
+ if (Qt5Qmqtt_FIND_VERSION_EXACT)
+ set(_Qt5Qmqtt_FIND_VERSION_EXACT EXACT)
+ endif()
+
+ set(Qt5Qmqtt_EXECUTABLE_COMPILE_FLAGS "")
+
+ foreach(_module_dep ${_Qt5Qmqtt_MODULE_DEPENDENCIES})
+ if (NOT Qt5${_module_dep}_FOUND)
+ find_package(Qt5${_module_dep}
+ 1.0.2 ${_Qt5Qmqtt_FIND_VERSION_EXACT}
+ ${_Qt5Qmqtt_DEPENDENCIES_FIND_QUIET}
+ ${_Qt5Qmqtt_FIND_DEPENDENCIES_REQUIRED}
+ PATHS "${CMAKE_CURRENT_LIST_DIR}/.." NO_DEFAULT_PATH
+ )
+ endif()
+
+ if (NOT Qt5${_module_dep}_FOUND)
+ set(Qt5Qmqtt_FOUND False)
+ return()
+ endif()
+
+ list(APPEND Qt5Qmqtt_INCLUDE_DIRS "${Qt5${_module_dep}_INCLUDE_DIRS}")
+ list(APPEND Qt5Qmqtt_PRIVATE_INCLUDE_DIRS "${Qt5${_module_dep}_PRIVATE_INCLUDE_DIRS}")
+ list(APPEND Qt5Qmqtt_DEFINITIONS ${Qt5${_module_dep}_DEFINITIONS})
+ list(APPEND Qt5Qmqtt_COMPILE_DEFINITIONS ${Qt5${_module_dep}_COMPILE_DEFINITIONS})
+ list(APPEND Qt5Qmqtt_EXECUTABLE_COMPILE_FLAGS ${Qt5${_module_dep}_EXECUTABLE_COMPILE_FLAGS})
+ endforeach()
+ list(REMOVE_DUPLICATES Qt5Qmqtt_INCLUDE_DIRS)
+ list(REMOVE_DUPLICATES Qt5Qmqtt_PRIVATE_INCLUDE_DIRS)
+ list(REMOVE_DUPLICATES Qt5Qmqtt_DEFINITIONS)
+ list(REMOVE_DUPLICATES Qt5Qmqtt_COMPILE_DEFINITIONS)
+ list(REMOVE_DUPLICATES Qt5Qmqtt_EXECUTABLE_COMPILE_FLAGS)
+
+ set(_Qt5Qmqtt_LIB_DEPENDENCIES "Qt5::Network;Qt5::Core")
+
+
+ add_library(Qt5::Qmqtt SHARED IMPORTED)
+
+ set_property(TARGET Qt5::Qmqtt PROPERTY
+ INTERFACE_INCLUDE_DIRECTORIES ${_Qt5Qmqtt_OWN_INCLUDE_DIRS})
+ set_property(TARGET Qt5::Qmqtt PROPERTY
+ INTERFACE_COMPILE_DEFINITIONS QT_QMQTT_LIB)
+
+ set_property(TARGET Qt5::Qmqtt PROPERTY INTERFACE_QT_ENABLED_FEATURES )
+ set_property(TARGET Qt5::Qmqtt PROPERTY INTERFACE_QT_DISABLED_FEATURES )
+
+ set(_Qt5Qmqtt_PRIVATE_DIRS_EXIST TRUE)
+ foreach (_Qt5Qmqtt_PRIVATE_DIR ${Qt5Qmqtt_OWN_PRIVATE_INCLUDE_DIRS})
+ if (NOT EXISTS ${_Qt5Qmqtt_PRIVATE_DIR})
+ set(_Qt5Qmqtt_PRIVATE_DIRS_EXIST FALSE)
+ endif()
+ endforeach()
+
+ if (_Qt5Qmqtt_PRIVATE_DIRS_EXIST)
+ add_library(Qt5::QmqttPrivate INTERFACE IMPORTED)
+ set_property(TARGET Qt5::QmqttPrivate PROPERTY
+ INTERFACE_INCLUDE_DIRECTORIES ${Qt5Qmqtt_OWN_PRIVATE_INCLUDE_DIRS}
+ )
+ set(_Qt5Qmqtt_PRIVATEDEPS)
+ foreach(dep ${_Qt5Qmqtt_LIB_DEPENDENCIES})
+ if (TARGET ${dep}Private)
+ list(APPEND _Qt5Qmqtt_PRIVATEDEPS ${dep}Private)
+ endif()
+ endforeach()
+ set_property(TARGET Qt5::QmqttPrivate PROPERTY
+ INTERFACE_LINK_LIBRARIES Qt5::Qmqtt ${_Qt5Qmqtt_PRIVATEDEPS}
+ )
+ endif()
+
+ _populate_Qmqtt_target_properties(RELEASE "Qt5Qmqtt.dll" "libQt5Qmqtt.a" )
+
+
+
+ _populate_Qmqtt_target_properties(DEBUG "Qt5Qmqttd.dll" "libQt5Qmqttd.a" )
+
+
+
+ file(GLOB pluginTargets "${CMAKE_CURRENT_LIST_DIR}/Qt5Qmqtt_*Plugin.cmake")
+
+ macro(_populate_Qmqtt_plugin_properties Plugin Configuration PLUGIN_LOCATION)
+ set_property(TARGET Qt5::${Plugin} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${Configuration})
+
+ set(imported_location "${_qt5Qmqtt_install_prefix}/plugins/${PLUGIN_LOCATION}")
+ _qt5_Qmqtt_check_file_exists(${imported_location})
+ set_target_properties(Qt5::${Plugin} PROPERTIES
+ "IMPORTED_LOCATION_${Configuration}" ${imported_location}
+ )
+ endmacro()
+
+ if (pluginTargets)
+ foreach(pluginTarget ${pluginTargets})
+ include(${pluginTarget})
+ endforeach()
+ endif()
+
+
+
+
+_qt5_Qmqtt_check_file_exists("${CMAKE_CURRENT_LIST_DIR}/Qt5QmqttConfigVersion.cmake")
+
+endif()
diff --git a/lib/mqtt/cmake/Qt5Qmqtt/Qt5QmqttConfigVersion.cmake b/lib/mqtt/cmake/Qt5Qmqtt/Qt5QmqttConfigVersion.cmake
new file mode 100644
index 0000000..53124b1
--- /dev/null
+++ b/lib/mqtt/cmake/Qt5Qmqtt/Qt5QmqttConfigVersion.cmake
@@ -0,0 +1,11 @@
+
+set(PACKAGE_VERSION 1.0.2)
+
+if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
+ set(PACKAGE_VERSION_EXACT TRUE)
+ endif()
+endif()
diff --git a/lib/mqtt/pkgconfig/Qt5Qmqtt.pc b/lib/mqtt/pkgconfig/Qt5Qmqtt.pc
new file mode 100644
index 0000000..62f2ba8
--- /dev/null
+++ b/lib/mqtt/pkgconfig/Qt5Qmqtt.pc
@@ -0,0 +1,13 @@
+prefix=D:/Qt/Qt5.12.11/5.12.11/mingw73_32
+exec_prefix=${prefix}
+libdir=${prefix}/lib
+includedir=${prefix}/include
+
+
+Name: Qt5 Qmqtt
+Description: Qt Qmqtt module
+Version: 1.0.2
+Libs: -L${libdir} -lQt5Qmqttd
+Cflags: -DQT_QMQTT_LIB -I${includedir}/QtQmqtt -I${includedir}
+Requires: Qt5Core Qt5Network
+
diff --git a/log.cpp b/log.cpp
new file mode 100644
index 0000000..2fc6422
--- /dev/null
+++ b/log.cpp
@@ -0,0 +1,75 @@
+#include "log.h"
+#include
+#include
+#include
+#include
+#include
+#include
+
+void setLogPath(const QString & path)
+{
+ s_logPath = path;
+}
+
+void setLogLevel(int level)
+{
+ s_logLevel = level;
+}
+
+bool static ensureDirExist(const QString &dirPath)
+{
+ QDir dir(dirPath);
+ if (dir.exists())
+ {
+ return true;
+ }
+
+ return dir.mkpath(dirPath);
+}
+
+void customLogMessageHandler(QtMsgType type, const QString& msg)
+{
+ if (type < s_logLevel)
+ {
+ return;
+ }
+
+ QString logInfo;
+ QString logTime = QDateTime::currentDateTime().toString("hh-mm-ss-MM-dd-yyyy");
+ switch (type)
+ {
+ case QtDebugMsg:
+ logInfo = QString("%1 [Debug] %2").arg(logTime, msg);
+ break;
+
+ case QtWarningMsg:
+ logInfo = QString("%1 [Warning] %2").arg(logTime, msg);
+ break;
+
+ case QtCriticalMsg:
+ logInfo = QString("%1 [Critical] %2").arg(logTime, msg);
+ break;
+
+ case QtFatalMsg:
+ logInfo = QString("%1 [Fatal] %2").arg(logTime, msg);
+ //abort();
+ break;
+ case QtInfoMsg:
+ logInfo = QString("%1 [Info] %2").arg(logTime, msg);
+ break;
+ }
+
+ s_logMutex.lock();
+ QFile outFile(LOG_FILE_NAME);
+ QFileInfo fileInfo(outFile);
+ if (!ensureDirExist(fileInfo.absoluteDir().absolutePath()))
+ return;
+
+ if (!outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
+ return;
+
+ QTextStream ts(&outFile);
+ ts << logInfo << endl;
+ outFile.close();
+ s_logMutex.unlock();
+}
diff --git a/log.h b/log.h
new file mode 100644
index 0000000..1aa2bd6
--- /dev/null
+++ b/log.h
@@ -0,0 +1,20 @@
+#ifndef LOG_H
+#define LOG_H
+
+
+#include
+#include
+#include
+
+#define LOG_FILE_NAME QCoreApplication::applicationDirPath() + QString("\\Log\\") + QDateTime::currentDateTime().toString("yyyy-MM-dd") + QString(".log")
+
+static int s_logLevel = 0;
+static QMutex s_logMutex;
+static QString s_logPath;
+
+void setLogPath(const QString &path);
+void setLogLevel(int level);
+//void customLogMessageHandler(QtMsgType type, const QMessageLogContext& ctx, const QString& msg);
+void customLogMessageHandler(QtMsgType type, const QString& msg);
+
+#endif // LOG_H
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 1446227..15dec6e 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -61,6 +61,14 @@ MainWindow::MainWindow(QWidget *parent) :
connect(pRealTimeForm,SIGNAL(sigWCStatus(QString&)), this, SLOT(slotWCStatus(QString&)));
connect(pRealTimeForm,SIGNAL(sigRPM(QString&)), this, SLOT(slotRPM(QString&)));
+
+ mqttclient = new MqttClient(this);
+ mqttclient->ConnectMQTT(IP);
+
+ m_strTriggerEnevtTopic = QString("up/%1/trigger").arg(MAC);//订阅
+ mqttclient->subscribed(m_strTriggerEnevtTopic);
+ connect(mqttclient, SIGNAL(Recevive_sig(QString,QByteArray)), this, SLOT(mqttReceive_slot(QString,QByteArray)));
+
}
MainWindow::~MainWindow()
@@ -435,6 +443,9 @@ void MainWindow::leftConfigClick4()
delete pTerminalInfo;
pTerminalInfo = NULL;
}
+ }else if(name == "通道标定"){
+ QProcess process(this);
+ process.startDetached(".\\Calibration\\NARI3500Calibration.exe");
}
//ui->label->setText(name);
}
@@ -510,11 +521,16 @@ void MainWindow::slotWCStatus(QString& strWCStatus)
QStringList strList = strWCStatus.split(",");
ui->label_WC->setText(strList[1]);
ui->label_Trg->setText(strList[0]);
-
}
+
void MainWindow::slotRPM(QString& str)
{
-
ui->label_RPM->setText(str);
-
+}
+
+void MainWindow::mqttReceive_slot(QString strTopic,QByteArray payload)
+{
+ if(strTopic == m_strTriggerEnevtTopic){
+ QString strReceive = QString(payload);
+ }
}
diff --git a/mainwindow.h b/mainwindow.h
index 5cedc44..ca72413 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -26,6 +26,8 @@
#include "sqlitedb.h"
#include "global.h"
+#include "Mqttclient.h"
+
class QAbstractButton;
@@ -57,6 +59,7 @@ private slots:
void leftConfigClick4();
void slotWCStatus(QString&);
void slotRPM(QString&);
+ void mqttReceive_slot(QString,QByteArray);
private:
Ui::MainWindow *ui;
@@ -84,6 +87,8 @@ private:
CSystemSelfcheck *pSystemSelfcheck;
CDIO_Board *pDIOBoard;
+ MqttClient *mqttclient;
+ QString m_strTriggerEnevtTopic;
};
diff --git a/qss.qrc b/qss.qrc
index 7ad8e93..5805738 100644
--- a/qss.qrc
+++ b/qss.qrc
@@ -24,7 +24,6 @@
qss/blacksoft/radiobutton_unchecked.png
qss/blacksoft/radiobutton_unchecked_disable.png
qss/blacksoft.css
- image/1.png
image/logo.png
image/Btn/hand.png
image/Btn/hand-p.png
diff --git a/qss/blacksoft.css b/qss/blacksoft.css
index 74305b2..818ff01 100644
--- a/qss/blacksoft.css
+++ b/qss/blacksoft.css
@@ -81,7 +81,7 @@ background-color:#636363;
font: 14pt ;
}
QWidget[nav="left"] QAbstractButton:hover{
-color:#FFFFFF;
+color:#ffffff;
background-color:#AAAAAA;
font: 16pt ;
}*/
@@ -106,7 +106,7 @@ border-radius:3px;
padding:2px;
background:none;
selection-background-color:#AAAAAA;
-selection-color:#FFFFFF;
+selection-color:#ffffff;
}
QLineEdit:focus,QTextEdit:focus,QPlainTextEdit:focus,QSpinBox:focus,QDoubleSpinBox:focus,QComboBox:focus,QDateEdit:focus,QTimeEdit:focus,QDateTimeEdit:focus,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QSpinBox:hover,QDoubleSpinBox:hover,QComboBox:hover,QDateEdit:hover,QTimeEdit:hover,QDateTimeEdit:hover{
@@ -156,6 +156,9 @@ background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #484848,stop:1
image:None;
}*/
+
+
+
QToolButton#btnMenu,QPushButton#btnMenu_Min,QPushButton#btnMenu_Max,QPushButton#btnMenu_Close{
border-radius:3px;
color:#DCDCDC;
@@ -166,13 +169,13 @@ border-style:none;
}
QToolButton#btnMenu:hover,QPushButton#btnMenu_Min:hover,QPushButton#btnMenu_Max:hover{
-color:#FFFFFF;
+color:#ffffff;
margin:1px 1px 2px 1px;
background-color:rgba(51,127,209,230);
}
QPushButton#btnMenu_Close:hover{
-color:#FFFFFF;
+color:#ffffff;
margin:1px 1px 2px 1px;
background-color:rgba(238,0,0,128);
}
@@ -681,8 +684,18 @@ border-radius:3px;
margin:3px 3px 3px 3px;
padding:3px;
background:none;
+
}
+QToolButton#qt_calendar_monthbutton,#qt_calendar_yearbutton{
+
+color: #9ea5a9;
+
+font: 9pt simHei;
+
+}
+
+
QToolButton#qt_calendar_prevmonth:hover,QToolButton#qt_calendar_nextmonth:hover,QToolButton#qt_calendar_monthbutton:hover,QToolButton#qt_calendar_yearbutton:hover,QToolButton#qt_calendar_prevmonth:pressed,QToolButton#qt_calendar_nextmonth:pressed,QToolButton#qt_calendar_monthbutton:pressed,QToolButton#qt_calendar_yearbutton:pressed{
border:1px solid #242424;
}
@@ -702,7 +715,8 @@ border-width:0px;
QCalendarWidget QWidget#qt_calendar_navigationbar{
border:1px solid #242424;
border-width:1px 1px 0px 1px;
-background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #484848,stop:1 #383838);
+
+background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #245d9b,stop:1 #245d9b);
}
QTableView[model="true"]::item{
@@ -716,6 +730,9 @@ border:2px groove gray;
border-radius: 15px;*/
}
+
+
+
QTableView QLineEdit:focus,QTableView QComboBox:focus,QTableView QSpinBox:focus,QTableView QDoubleSpinBox:focus,QTableView QDateEdit:focus,QTableView QTimeEdit:focus,QTableView QDateTimeEdit:focus{
border-width:0px;
border-radius:0px;
@@ -747,7 +764,7 @@ QMessageBox {
QMessageBox QLabel#qt_msgbox_label { /* textLabel */
color: #298DFF;
background-color: transparent;
- min-width: 240px; /* textLabel设置最小宽度可以相应的改变QMessageBox的最小宽度 */
+ min-width: 340px; /* textLabel设置最小宽度可以相应的改变QMessageBox的最小宽度 */
min-height: 40px; /* textLabel和iconLabel高度保持一致 */
font-size: 24pt;
}
@@ -782,6 +799,17 @@ QMessageBox QDialogButtonBox#qt_msgbox_buttonbox { /* buttonBox */
button-layout: 0; /* 设置QPushButton布局好像没啥作用 */
}
+QPushButton{
+width:120px;
+height: 35px;
+color: black;
+background: inherit;
+background-color: rgba(255, 255, 255, 0);
+border-width: 1px;
+border-style: solid;
+border-color: #245d9b;
+}
+
QListView[noborder="true"],QTreeView[noborder="true"],QTabWidget[noborder="true"]::pane{
border-width:0px;
@@ -803,7 +831,7 @@ background-color:#245d9b;
}
QWidget[flag="Title2"] {
-color:#000000;
+color:#ffffff;
background-color:#ffffff;
}
diff --git a/realtimeform.cpp b/realtimeform.cpp
index 100a1ce..8408afd 100644
--- a/realtimeform.cpp
+++ b/realtimeform.cpp
@@ -10,6 +10,9 @@
#include "MyCustomGraphicsItem.h"
#include "NetMgr.h"
#include
+#include "QGraphicsMovieItem.h"
+#include
+#include "log.h"
CRealTimeForm::CRealTimeForm(QWidget *parent) :
QWidget(parent),
@@ -46,12 +49,12 @@ CRealTimeForm::CRealTimeForm(QWidget *parent) :
//QObject::connect(m_pSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));
-
- LoadGraphicsConfig();
+ m_EditMode = 0;
+ LoadGraphicsConfig(0);
InitChannelInfo();
- m_strServerIp = IP;
+ //m_strServerIp = IP;
m_nServerPort = 7305;
m_pSocket = new QTcpSocket(this);
@@ -97,7 +100,7 @@ void CRealTimeForm::timerEvent(QTimerEvent *ev)
QJsonObject allObj;
allObj.insert("cmd", "09");
// 设置IP和端口号连接
- m_pSocket->connectToHost(m_strServerIp, m_nServerPort);
+ m_pSocket->connectToHost(IP, m_nServerPort);
// 设置超时连接时间
m_bConnected = m_pSocket->waitForConnected(1 * 1000);
@@ -114,7 +117,10 @@ void CRealTimeForm::timerEvent(QTimerEvent *ev)
int nRet = m_pSocket->write(strData.toStdString().c_str(), strlen(strData.toStdString().c_str()));
- // qDebug() << "nRet" << nRet << endl;
+ if(nRet !=0){
+ qDebug() << "09 通信失败" << endl;
+ customLogMessageHandler(QtWarningMsg,"09通信失败");
+ }
}
}
@@ -152,6 +158,7 @@ void CRealTimeForm::on_graphView_customContextMenuRequested(const QPoint &pos)
pActionRect = menu.addAction("添加通道");
pActionPixmap = menu.addAction("添加图片");
pActionText = menu.addAction("添加文字");
+ pActionEdit = menu.addAction("编辑");
pActionSave = menu.addAction("保存");
pActionVerticalLine->setData(1);
@@ -160,6 +167,7 @@ void CRealTimeForm::on_graphView_customContextMenuRequested(const QPoint &pos)
pActionPixmap->setData(4);
pActionText->setData(5);
pActionSave->setData(6);
+ pActionEdit->setData(7);
connect(pActionVerticalLine, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pActionHorizontalLine, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
@@ -167,6 +175,7 @@ void CRealTimeForm::on_graphView_customContextMenuRequested(const QPoint &pos)
connect(pActionPixmap, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pActionText, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pActionSave, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
+ connect(pActionEdit, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
menu.exec(QCursor::pos());
//menu.exec(ui->graphicsView->mapToGlobal(pos));
@@ -203,9 +212,17 @@ void CRealTimeForm::onTaskBoxContextMenuEvent()
case 6:
SetCurDrawType("Save");
break;
+ case 7:
+ SetEdit();
+ break;
}
}
+void CRealTimeForm::SetEdit()
+{
+ m_EditMode = 1;
+ LoadGraphicsConfig(1);
+}
void CRealTimeForm::on_addchannel(channelBaseInfo channelbaseInfo,QString str)
{
@@ -304,6 +321,10 @@ void CRealTimeForm::on_addchannel(channelBaseInfo channelbaseInfo,QString str)
void CRealTimeForm::SetCurDrawType(QString strType)
{
+ if(!m_EditMode){
+ QMessageBox::information(this, QStringLiteral("提示"), "请先进入编辑模式!");
+ return;
+ }
if(strType == "vertical"){
QGraphicsLineItem* pLine = new QGraphicsLineItem(0, 0, 100, 100);
pLine->setPos(-300, 0);
@@ -334,15 +355,46 @@ void CRealTimeForm::SetCurDrawType(QString strType)
connect(pAddChannel,SIGNAL(addChannel_sg(channelBaseInfo,QString)),this,SLOT(on_addchannel(channelBaseInfo,QString)));
}else if (strType == "Pixmap"){
- QGraphicsPixmapItem* pPixmap = new QGraphicsPixmapItem(QPixmap(":/image/1.png"));
- // 设置可移动、可选择
- pPixmap->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
- if(ui->tabWidget->currentIndex() == 0){
- m_pGraphicsScene->addItem(pPixmap);
- }else if(ui->tabWidget->currentIndex() == 1){
- m_pGraphicsScene_2->addItem(pPixmap);
+ QString name = QCoreApplication::applicationDirPath() + "\\config\\UnitParameters.json";
+ QFile loadFile(name);
+ if(!loadFile.open(QIODevice::ReadOnly))
+ {
+ qDebug() << "could't open projects json";
+ return;
+ }
+ QString value = loadFile.readAll();
+ loadFile.close();
+ QJsonParseError parseJsonErr;
+ QJsonDocument document = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
+ if (!(parseJsonErr.error == QJsonParseError::NoError)) {
+ QMessageBox::about(NULL, "提示", "读取文件错误!");
+ return;
+ }
+
+ QJsonObject jsonObject = document.object();
+ if (jsonObject.contains(QStringLiteral("UnitStyle"))) {
+ QJsonValue jsonValue = jsonObject.value(QStringLiteral("UnitStyle"));
+ QString strContent = jsonValue["content"].toString();
+ QGraphicsPixmapItem* pPixmap = NULL;
+ if(strContent == "混流式机组"){
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/hunliushi.png"));
+ }else if(strContent == "轴流定桨式机组" || strContent == "轴流转浆式机组"){
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/zhouliushi.png"));
+ }else if(strContent == "可逆式机组"){
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/kenishi.png"));
+ }else if(strContent == "灯泡式机组"){
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/dengpaoshi.png"));
+ }
+ // 设置可移动、可选择
+ pPixmap->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ if(ui->tabWidget->currentIndex() == 0){
+ m_pGraphicsScene->addItem(pPixmap);
+ }else if(ui->tabWidget->currentIndex() == 1){
+ m_pGraphicsScene_2->addItem(pPixmap);
+ }
+ pPixmap->setPos(0,0);
+
}
- pPixmap->setPos(0,0);
}else if (strType == "Text") {
QGraphicsTextItem* pText = new QGraphicsTextItem("请输入...");
@@ -357,13 +409,16 @@ void CRealTimeForm::SetCurDrawType(QString strType)
pText->setPos(0,0);
}else if (strType == "Save") {
SaveGraphicsConfig();
+ LoadGraphicsConfig(0);
}
+
ui->graphicsView->update();
}
void CRealTimeForm::SaveGraphicsConfig()
{
+ m_EditMode = 0;
QJsonObject jsonObject;
QJsonArray RectjsonArray;
QJsonArray LinejsonArray;
@@ -380,7 +435,7 @@ void CRealTimeForm::SaveGraphicsConfig()
foreach (QGraphicsItem *item, items) {
QGraphicsItem* graphicsItem = static_cast(item);
int itemType = graphicsItem->type();
- qDebug() << "itemType" << itemType << endl;
+ //qDebug() << "itemType" << itemType << endl;
switch (itemType) {
// case 3: {//Rect
// QPointF pos = graphicsItem->pos();
@@ -400,7 +455,7 @@ void CRealTimeForm::SaveGraphicsConfig()
{
QPointF pos = graphicsItem->pos();
QRectF rect = graphicsItem->boundingRect();
- qDebug() << "Line" << pos << rect;
+ //qDebug() << "Line" << pos << rect;
QJsonObject LinejsonObject;
LinejsonObject.insert("x", pos.x());
LinejsonObject.insert("y", pos.y());
@@ -412,9 +467,10 @@ void CRealTimeForm::SaveGraphicsConfig()
break;
case 7://Pixmap
{
+
QPointF pos = graphicsItem->pos();
QRectF rect = graphicsItem->boundingRect();
- qDebug() << "Pixmap" << pos << rect;
+ //qDebug() << "Pixmap" << pos << rect;
QJsonObject PixmapjsonObject;
PixmapjsonObject.insert("x", pos.x());
PixmapjsonObject.insert("y", pos.y());
@@ -446,7 +502,7 @@ void CRealTimeForm::SaveGraphicsConfig()
channelBaseInfo temp;
//qDebug() << "Group" << pos << rect;
QString strChannelID = pGraphicGroupItem->data(0).toString();
- qDebug() << "pGraphicGroupItem data" << strChannelID << endl;
+ //qDebug() << "pGraphicGroupItem data" << strChannelID << endl;
QJsonArray GroupRectjsonArray,GroupTextjsonArray;
QJsonObject itemjsonObject;
QList items = pGraphicGroupItem->childItems();
@@ -457,26 +513,26 @@ void CRealTimeForm::SaveGraphicsConfig()
itemData = item->data(i).toString();
if(itemData == "value"){
itemData2 = item->data(i+1).toString();
- qDebug() << "item va data" << itemData << itemData2 << i << endl;
+ //qDebug() << "item va data" << itemData << itemData2 << i << endl;
break;
}else if (itemData == "channel") {
- qDebug() << "item ch data" << itemData << i << endl;
+ //qDebug() << "item ch data" << itemData << i << endl;
break;
}else if(itemData == "units"){
- qDebug() << "item un data" << itemData << i << endl;
+ //qDebug() << "item un data" << itemData << i << endl;
break;
}
}
QGraphicsItem* graphicsItem = static_cast(item);
int itemType = graphicsItem->type();
- qDebug() << "itemData2" << itemData << endl;
+ //qDebug() << "itemData2" << itemData << endl;
switch (itemType) {
case 3: {//Rect
QPointF pos = graphicsItem->pos();
QRectF rect = graphicsItem->boundingRect();
- qDebug() << "group Rect" << pos << rect;
+ //qDebug() << "group Rect" << pos << rect;
QJsonObject RectjsonObject;
RectjsonObject.insert("x", pos.x());
RectjsonObject.insert("y", pos.y());
@@ -567,7 +623,7 @@ void CRealTimeForm::slotDoubleClick(QGraphicsSceneMouseEvent *event)
qDebug() << "QGraphicsItem" << pGraphicGroupItem->childItems() << endl;
}
-void CRealTimeForm::LoadGraphicsConfig()
+void CRealTimeForm::LoadGraphicsConfig(int type)
{
//读取图元的数据
@@ -582,10 +638,9 @@ void CRealTimeForm::LoadGraphicsConfig()
for (int ii = 0; ii < ui->tabWidget->count(); ii++) {
QString strFileName = QString("Graph%1.json").arg(ii+1);
QString fileName = QCoreApplication::applicationDirPath() + "\\config\\" + strFileName;
-
+ qDebug() << "打开" << fileName ;
if(!fileName.isEmpty())
{
- qDebug() << "打开" << fileName ;
QFile file(fileName);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QString value = file.readAll();
@@ -613,7 +668,8 @@ void CRealTimeForm::LoadGraphicsConfig()
key["w"].toDouble(), key["h"].toDouble());
pLine->setPos(key["x"].toDouble(), key["y"].toDouble());
pLine->setRotation(key["rotation"].toInt());
- pLine->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ if(type)
+ pLine->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
if(ii == 0){
m_pGraphicsScene->addItem(pLine);
}else if(ii == 1){
@@ -635,11 +691,12 @@ void CRealTimeForm::LoadGraphicsConfig()
0,
key["w"].toDouble(), key["h"].toDouble());
pRect->setPos(key["x"].toDouble(), key["y"].toDouble());
- pRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ if(type)
+ pRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
if(ii == 0){
m_pGraphicsScene->addItem(pRect);
}else if(ii == 1){
- m_pGraphicsScene_2->addItem(pRect);
+ m_pGraphicsScene_2->addItem(pRect);
}
}
}
@@ -652,26 +709,124 @@ void CRealTimeForm::LoadGraphicsConfig()
for (int i = 0; i < array.size(); i++) {
QJsonValue nameArray = array.at(i);
QJsonObject key = nameArray.toObject();
-
- QGraphicsPixmapItem *pPixmap = new QGraphicsPixmapItem(QPixmap(":/image/1.png"));
- pPixmap->setPos(key["x"].toInt(), key["y"].toInt());
- pPixmap->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
- if(ii == 0){
- m_pGraphicsScene->addItem(pPixmap);
- }else if(ii == 1){
- m_pGraphicsScene_2->addItem(pPixmap);
+ QString name = QCoreApplication::applicationDirPath() + "\\config\\UnitParameters.json";
+ QFile loadFile(name);
+ if(!loadFile.open(QIODevice::ReadOnly))
+ {
+ qDebug() << "could't open projects json";
+ return;
}
+ QString value = loadFile.readAll();
+ loadFile.close();
+ QJsonParseError parseJsonErr;
+ QJsonDocument document = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
+ if (!(parseJsonErr.error == QJsonParseError::NoError)) {
+ QMessageBox::about(NULL, "提示", "读取文件错误!");
+ return;
+ }
+
+ QJsonObject jsonObject = document.object();
+ if (jsonObject.contains(QStringLiteral("UnitStyle"))) {
+ QJsonValue jsonValue = jsonObject.value(QStringLiteral("UnitStyle"));
+ QString strContent = jsonValue["content"].toString();
+ QGraphicsPixmapItem* pPixmap = NULL;
+ QLabel *gif_anim = new QLabel();
+ QMovie *movie = NULL;
+ qDebug() << "strContent" << strContent << endl;
+ if(strContent == "混流式机组"){
+ if(type)
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/hunliushi.png"));
+ else
+ movie = new QMovie(QCoreApplication::applicationDirPath() + "/image/unit/hunliushi.gif");
+
+ }else if(strContent == "轴流定桨式机组" || strContent == "轴流转浆式机组"){
+ if(type)
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/zhouliushi.png"));
+ else
+ movie = new QMovie(QCoreApplication::applicationDirPath() + "/image/unit/zhouliushi.gif");
+ //pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/zhouliushi.png"));
+ }else if(strContent == "可逆式机组"){
+ if(type)
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/kenishi.png"));
+ else
+ movie = new QMovie(QCoreApplication::applicationDirPath() + "/image/unit/kenishi.gif");
+ //pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/kenishi.png"));
+ }else if(strContent == "灯泡式机组"){
+ if(type)
+ pPixmap = new QGraphicsPixmapItem(QPixmap(QCoreApplication::applicationDirPath() + "/image/unit/dengpaoshi.png"));
+ else
+ movie = new QMovie(QCoreApplication::applicationDirPath() + "/image/unit/dengpaoshi.gif");
+ }
+ qDebug() << "type" << type << ii << endl;
+ if(type){
+ pPixmap->setPos(key["x"].toInt(), key["y"].toInt());
+ // 设置可移动、可选择
+ pPixmap->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ if(ii == 0){
+ m_pGraphicsScene->addItem(pPixmap);
+ }else if(ii == 1){
+ m_pGraphicsScene_2->addItem(pPixmap);
+ }
+ }else{
+ gif_anim->setMovie(movie);
+ movie->start();
+ QGraphicsProxyWidget *proxy = NULL;
+ if(ii == 0){
+ qDebug() << "strContent111" << strContent << endl;
+ proxy = m_pGraphicsScene->addWidget(gif_anim);
+ }else if(ii == 1){
+ proxy = m_pGraphicsScene_2->addWidget(gif_anim);
+ }
+ proxy->setGeometry(QRectF(key["x"].toInt(),key["y"].toInt(),460,478));
+ }
+
+ }
+// QGraphicsPixmapItem *pPixmap = new QGraphicsPixmapItem(QPixmap(":/image/1.png"));
+// pPixmap->setPos(key["x"].toInt(), key["y"].toInt());
+// pPixmap->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+// if(ii == 0){
+// m_pGraphicsScene->addItem(pPixmap);
+// }else if(ii == 1){
+// m_pGraphicsScene_2->addItem(pPixmap);
+// }
+// QLabel *gif_anim = new QLabel();
+// QMovie *movie = new QMovie(":/image/1.gif");
+// gif_anim->setMovie(movie);
+// movie->start();
+// QGraphicsProxyWidget *proxy = m_pGraphicsScene->addWidget(gif_anim);
+
+// QGraphicsMovieItem *pPixmap = new QGraphicsMovieItem();
+// pPixmap->setPos(key["x"].toInt(), key["y"].toInt());
+// QMovie movie(":/image/1.png");
+// pPixmap->setMovie(&movie);
+// movie.start();
+// m_pGraphicsScene->addItem(pPixmap);
}
}
}
// Text字段
if (jsonObject.contains(QStringLiteral("Text"))) {
+ if(type){
+ QGraphicsTextItem *pText = new QGraphicsTextItem("正在编辑中...");
+ pText->setPos(-400, 750);
+ pText->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ QFont font ( "黑体", 20, 50);
+ font.setPixelSize(30);
+ pText->setDefaultTextColor(QColor(255, 0, 0));
+ pText->setFont(font);
+ if(ii == 0){
+ m_pGraphicsScene->addItem(pText);
+ }else if(ii == 1){
+ m_pGraphicsScene_2->addItem(pText);
+ }
+ }
QJsonValue arrayValue = jsonObject.value(QStringLiteral("Text"));
if (arrayValue.isArray()) {
QJsonArray array = arrayValue.toArray();
for (int i = 0; i < array.size(); i++) {
QJsonValue nameArray = array.at(i);
QJsonObject key = nameArray.toObject();
+
QGraphicsTextItem *pText = new QGraphicsTextItem(key["word"].toString());
pText->setPos(key["x"].toInt(), key["y"].toInt());
pText->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
@@ -682,7 +837,7 @@ void CRealTimeForm::LoadGraphicsConfig()
if(ii == 0){
m_pGraphicsScene->addItem(pText);
}else if(ii == 1){
- m_pGraphicsScene_2->addItem(pText);
+ m_pGraphicsScene_2->addItem(pText);
}
}
}
@@ -695,9 +850,10 @@ void CRealTimeForm::LoadGraphicsConfig()
for (int i = 0; i < array.size(); i++) {
channelBaseInfo temp;
CMyCustomGraphicsItem* pItemGroup = new CMyCustomGraphicsItem();
- pItemGroup->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ if(type)
+ pItemGroup->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
connect(pItemGroup, SIGNAL(doubleclick(QGraphicsSceneMouseEvent*)), this, SLOT(slotDoubleClick(QGraphicsSceneMouseEvent*)));
- qDebug() << array.at(i)["x"].toDouble() << array.at(i)["y"].toDouble() << endl;
+ //qDebug() << array.at(i)["x"].toDouble() << array.at(i)["y"].toDouble() << endl;
QJsonObject jsonObject = array.at(i).toObject();
@@ -713,7 +869,8 @@ void CRealTimeForm::LoadGraphicsConfig()
0,
470, 50);
pRect->setPos(key["x"].toDouble(), key["y"].toDouble());
- pRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ if(type)
+ pRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
pRect->setBrush(QBrush(QColor(255, 255, 255)));
pRect->setPen(pen);
pItemGroup->addToGroup(pRect);
@@ -730,8 +887,10 @@ void CRealTimeForm::LoadGraphicsConfig()
QGraphicsTextItem *pText = new QGraphicsTextItem(key["word"].toString());
pText->setPos(key["x"].toDouble(), key["y"].toDouble());
- pText->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
- pText->setTextInteractionFlags(Qt::TextEditorInteraction);
+ if(type){
+ pText->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+ pText->setTextInteractionFlags(Qt::TextEditorInteraction);
+ }
QFont font;
QFont font2 ( "黑体", 20, 50);
font.setPixelSize(25);
@@ -805,7 +964,7 @@ void CRealTimeForm::keyPressEvent(QKeyEvent *event)
void CRealTimeForm::UpdateCharacteristic(QVector<_Charateristic>& m_vecCharateristic)
{
- QString RPM = "";
+ QString RPM = "0";
if(m_vecCharateristic.size() > 0){
for (int i = 0; i < m_vecCharateristic.size(); i++) {
QList items;
@@ -948,25 +1107,26 @@ void CRealTimeForm::slotRecieve()
{
QByteArray arrayReady = m_pSocket->readAll();
m_arrayReady += arrayReady;
- //qDebug() << "arrayReady" << arrayReady << endl;
- QJsonDocument doc = QJsonDocument::fromJson(arrayReady);
- QJsonObject objec = doc.object();
- if(objec.contains("cmd"))
- {
- QJsonValue arrays_value = objec.take("cmd");
- qDebug()<<"cmd ="<
#include
#include
+#include
#include
#include
#include "sqlitedb.h"
@@ -98,6 +99,7 @@ private:
QAction *pActionRect ;
QAction *pActionPixmap ;
QAction *pActionText ;
+ QAction *pActionEdit ;
QAction *pActionSave ;
int id1; //定时器1的唯一标示
@@ -107,7 +109,8 @@ private:
void InitChannelInfo();
void SetCurDrawType(QString strType);
- void LoadGraphicsConfig();
+ void SetEdit();
+ void LoadGraphicsConfig(int type);
void SaveGraphicsConfig();
void UpdateCharacteristic(QVector<_Charateristic>& m_vecCharateristic);
void ParseCharacteristic(QJsonArray& arrayValue);
@@ -118,7 +121,7 @@ private:
bool m_bConnected; // 连接的标志
int m_nConnectWaitTimes; // 连接的等待时间
int m_nServerPort; // 服务端端口号
-
+ int m_EditMode;
NetMgr *m_pNetMgr; //HTTP消息类对象
QVector<_Charateristic> m_vecCharateristic;
diff --git a/sqlitedb.cpp b/sqlitedb.cpp
index d5a9705..81b0ba2 100644
--- a/sqlitedb.cpp
+++ b/sqlitedb.cpp
@@ -204,9 +204,9 @@ QVector SqliteDB::GetDataMultiLine(QString tablename, QString co
tempchannel.stopBrands = sql_query.value(81).toString();
tempchannel.tachAutoTach = sql_query.value(82).toBool();
tempchannel.tachTriggerEdge = sql_query.value(83).toString();
- tempchannel.tachTriggerHysteresis = sql_query.value(84).toInt();
+ tempchannel.tachTriggerHysteresis = sql_query.value(84).toDouble();
tempchannel.tachTriggerPerRev = sql_query.value(85).toString();
- tempchannel.tachTriggerVoltageLevel = sql_query.value(86).toBool();
+ tempchannel.tachTriggerVoltageLevel = sql_query.value(86).toDouble();
tempchannel.thermalCoupleType = sql_query.value(87).toString();
tempchannel.xFullScalePosition = sql_query.value(88).toString();
tempchannel.xProcessVariableName = sql_query.value(89).toString();
@@ -381,6 +381,46 @@ SqliteDB::GetTriggerConfig(QString tablename,QString whereCon)
return vecResult;
}
+QVector
+SqliteDB::GetTriggerEvent(QString tablename,QString whereCon)
+{
+ QSqlQuery sql_query;
+
+ QVector vecResult;
+ TriggerEvent_t tempTriggerEvent;
+ QString strSql;
+ if(whereCon == "")
+ strSql = QString("SELECT * FROM %1 ;").arg(tablename);
+ else
+ strSql = QString("SELECT * FROM %1 where %2;").arg(tablename).arg(whereCon);
+ sql_query.exec(strSql);
+ qDebug() << "strSql" < GetWorkCondition(QString tablename,QString whereCon = "");
QVector GetWorkConditionInfo(QString tablename,QString whereCon = "");
QVector GetTriggerConfig(QString tablename,QString whereCon = "");
+ QVector GetTriggerEvent(QString tablename,QString whereCon = "");
QString GetSingelLine(QString& tablename, QString& column, QString whereCon = "");
int DeleteData(QString& tablename, QString condColumnName = "", QString condColumnValue = "");
int DeleteDataW(QString& tablename, QString& whereCon);