298 lines
11 KiB
C++
298 lines
11 KiB
C++
#include "newdeviceformdialog.h"
|
|
#include "ui_newdeviceformdialog.h"
|
|
#include <QMessageBox>
|
|
#include <QSqlDatabase>
|
|
#include <QSqlQuery>
|
|
#include <QSqlError>
|
|
#include <QFileDialog>
|
|
#include <QSqlRecord>
|
|
#include <QListView>
|
|
#include <QComboBox>
|
|
#include <QStandardItemModel>
|
|
|
|
#include <QDebug>
|
|
#include <hv/hlog.h>
|
|
|
|
#include "frame_define.h"
|
|
#include "globalparameters.h"
|
|
#include "kutilities.h"
|
|
|
|
|
|
NewDeviceFormDialog::NewDeviceFormDialog(QWidget *parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::NewDeviceFormDialog)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
InitializeUi();
|
|
|
|
connect(ui->pb_OK, &QPushButton::clicked, this, &NewDeviceFormDialog::onOkClicked);
|
|
connect(ui->pb_Cancel, &QPushButton::clicked, this, &NewDeviceFormDialog::onCancelClicked);
|
|
connect(ui->pb_Import, &QPushButton::clicked, this, &NewDeviceFormDialog::browseFile);
|
|
connect(ui->cb_device, SIGNAL(currentTextChanged(const QString &)),this, SLOT(onComboBoxTextChanged(const QString &)));
|
|
}
|
|
|
|
NewDeviceFormDialog::~NewDeviceFormDialog()
|
|
{
|
|
// 关闭数据库
|
|
QSqlDatabase::database().close();
|
|
delete ui;
|
|
}
|
|
|
|
void NewDeviceFormDialog::onOkClicked()
|
|
{
|
|
|
|
}
|
|
|
|
void NewDeviceFormDialog::onCancelClicked()
|
|
{
|
|
}
|
|
|
|
bool NewDeviceFormDialog::openDatabase(const QString &dbName)
|
|
{
|
|
// 创建一个 SQLite 数据库连接
|
|
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
|
|
|
|
// 设置数据库的文件路径
|
|
db.setDatabaseName(dbName);
|
|
|
|
// 尝试打开数据库
|
|
if (!db.open())
|
|
{
|
|
// 如果打开失败,输出错误信息
|
|
hloge("Error: Failed to open database! %s",db.lastError().text().toStdString().c_str());
|
|
return false;
|
|
}
|
|
|
|
hlogd("Database opened successfully!");
|
|
|
|
return true;
|
|
}
|
|
|
|
void NewDeviceFormDialog::browseFile()
|
|
{
|
|
//首先断开连接
|
|
disconnect(ui->cb_device, SIGNAL(currentTextChanged(const QString &)),this, SLOT(onComboBoxTextChanged(const QString &)));
|
|
|
|
// 打开文件对话框,选择文件路径
|
|
QString filePath = QFileDialog::getOpenFileName(this, tr("Select Configuration File"), "", tr("Database Files (*.db);;All Files (*.*)"));
|
|
|
|
// 如果用户选择了文件,更新 QLineEdit 显示路径
|
|
if (!filePath.isEmpty())
|
|
{
|
|
ui->lineEdit->setText(filePath);
|
|
qDebug() << "Selected file path: " << filePath;
|
|
|
|
openDatabase(filePath);
|
|
|
|
QSqlQuery query;
|
|
vecCfgTab_SmartDeviceType SmartDeviceTypes;
|
|
|
|
// 查询数据
|
|
if (!query.exec("SELECT DISTINCT Description FROM CfgTab_SmartDeviceType ORDER BY TypeID ASC"))
|
|
{
|
|
hloge("Error: Failed to select data! [%s]",query.lastError().text().toStdString().c_str());
|
|
}
|
|
else
|
|
{
|
|
QVector<QString> devs;
|
|
while (query.next())
|
|
{
|
|
QString s = query.value(0).toString();
|
|
devs.push_back(s);
|
|
}
|
|
|
|
foreach (QString device, devs)
|
|
{
|
|
QString sql = QString("SELECT * FROM CfgTab_SmartDeviceType where Description = '%1' ORDER BY ProtocolVersion desc LIMIT 1").arg(device);
|
|
if (!query.exec(sql))
|
|
{
|
|
hloge("Error: Failed to select data! [%s]",query.lastError().text().toStdString().c_str());
|
|
}
|
|
else
|
|
{
|
|
// 获取列名到 QSqlRecord
|
|
QSqlRecord record = query.record();
|
|
while (query.next())
|
|
{
|
|
CfgTabSmartDeviceTypeItem smartDeviceTypesItem;
|
|
smartDeviceTypesItem.TypeID = query.value(record.indexOf("TypeID")).toInt();
|
|
smartDeviceTypesItem.Description = query.value(record.indexOf("Description")).toString().toStdString();
|
|
smartDeviceTypesItem.ClassType = query.value(record.indexOf("ClassType")).toInt();
|
|
smartDeviceTypesItem.PortConfig = query.value(record.indexOf("PortConfig")).toInt();
|
|
smartDeviceTypesItem.InterfaceType = query.value(record.indexOf("InterfaceType")).toInt();
|
|
smartDeviceTypesItem.StationType = query.value(record.indexOf("StationType")).toInt();
|
|
smartDeviceTypesItem.EquipmentCode = query.value(record.indexOf("EquipmentCode")).toInt();
|
|
smartDeviceTypesItem.EquipmentModel = query.value(record.indexOf("EquipmentModel")).toString().toStdString();
|
|
smartDeviceTypesItem.Manufacturer = query.value(record.indexOf("Manufacturer")).toString().toStdString();
|
|
smartDeviceTypesItem.ProtocolVersion = query.value(record.indexOf("ProtocolVersion")).toString().toStdString();
|
|
smartDeviceTypesItem.SpecialOption = query.value(record.indexOf("SpecialOption")).toString().toStdString();
|
|
smartDeviceTypesItem.Notes = query.value(record.indexOf("Notes")).toString().toStdString();
|
|
|
|
qDebug() << "Type ID:" << smartDeviceTypesItem.TypeID << ", Description:" << smartDeviceTypesItem.Description.c_str() << ", ProtocolVersion:" << smartDeviceTypesItem.ProtocolVersion.c_str();
|
|
|
|
SmartDeviceTypes.emplace_back(smartDeviceTypesItem);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//设置串口模式
|
|
ui->cb_device->setView(new QListView(this));
|
|
QStandardItemModel* model_baund = new QStandardItemModel(this);
|
|
|
|
for (auto it = SmartDeviceTypes.begin(); it != SmartDeviceTypes.end(); it++)
|
|
{
|
|
int id = it->TypeID;
|
|
QString name = QString::fromStdString(it->Description);
|
|
QString a = QString("%1:%2:%3").arg(id).arg(name).arg(QString::fromStdString(it->ProtocolVersion));
|
|
|
|
QStandardItem* item = new QStandardItem(a);
|
|
item->setData(id);
|
|
model_baund->appendRow(item);
|
|
}
|
|
|
|
ui->cb_device->setModel(model_baund);
|
|
ui->cb_device->setCurrentIndex(2);
|
|
}
|
|
|
|
//重新连接槽函数
|
|
connect(ui->cb_device, SIGNAL(currentTextChanged(const QString &)),this, SLOT(onComboBoxTextChanged(const QString &)));
|
|
}
|
|
|
|
void NewDeviceFormDialog::onComboBoxTextChanged(const QString &text)
|
|
{
|
|
qDebug() << "ComboBox text changed to" << text;
|
|
}
|
|
|
|
void NewDeviceFormDialog::InitializeUi()
|
|
{
|
|
ui->slave_id->setText("1");
|
|
|
|
//设置奇偶校验
|
|
ui->cb_parity->setView(new QListView(this));
|
|
|
|
QStandardItemModel* model_parity = new QStandardItemModel(this);
|
|
|
|
vecParityItemData vparity;
|
|
vparity.push_back(std::make_pair(EMS_PARITY_NONE,tr("None")));
|
|
vparity.push_back(std::make_pair(EMS_PARITY_ODD,tr("Odd")));
|
|
vparity.push_back(std::make_pair(EMS_PARITY_EVEN,tr("Even")));
|
|
|
|
for (auto it = vparity.begin(); it != vparity.end(); it++)
|
|
{
|
|
int id = it->first;
|
|
QString name = it->second;
|
|
|
|
QStandardItem* item = new QStandardItem(name);
|
|
//QVariant var = QVariant::fromValue(data);
|
|
item->setData(id);
|
|
model_parity->appendRow(item);
|
|
}
|
|
|
|
ui->cb_parity->setModel(model_parity);
|
|
|
|
//设置数据位
|
|
ui->cb_data->setView(new QListView(this));
|
|
QStandardItemModel* model_databits = new QStandardItemModel(this);
|
|
vecDataBitsItemData vdatabits;
|
|
vdatabits.push_back(std::make_pair(EMS_DATA_8_BITS,tr("8 Data bits")));
|
|
vdatabits.push_back(std::make_pair(EMS_DATA_7_BITS,tr("7 Data bits")));
|
|
|
|
for (auto it = vdatabits.begin(); it != vdatabits.end(); it++)
|
|
{
|
|
int id = it->first;
|
|
QString name = it->second;
|
|
|
|
QStandardItem* item = new QStandardItem(name);
|
|
item->setData(id);
|
|
model_databits->appendRow(item);
|
|
}
|
|
|
|
ui->cb_data->setModel(model_databits);
|
|
|
|
//设置数据位
|
|
ui->cb_stop->setView(new QListView(this));
|
|
QStandardItemModel* model_stopbits = new QStandardItemModel(this);
|
|
vecDataBitsItemData vstopbits;
|
|
vstopbits.push_back(std::make_pair(EMS_1_STOP_BITS,tr("1 Stop bit")));
|
|
vstopbits.push_back(std::make_pair(EMS_2_STOP_BITS,tr("2 Stop bits")));
|
|
|
|
for (auto it = vstopbits.begin(); it != vstopbits.end(); it++)
|
|
{
|
|
int id = it->first;
|
|
QString name = it->second;
|
|
|
|
QStandardItem* item = new QStandardItem(name);
|
|
item->setData(id);
|
|
model_stopbits->appendRow(item);
|
|
}
|
|
|
|
ui->cb_stop->setModel(model_stopbits);
|
|
|
|
//设置串口模式
|
|
ui->cb_baund->setView(new QListView(this));
|
|
QStandardItemModel* model_baund = new QStandardItemModel(this);
|
|
vecBaundItemData vbaund;
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("2400")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("4800")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("9600")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("19200")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("38400")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("57600")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("115200")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("128000")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("153600")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("230400")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("460800")));
|
|
vbaund.push_back(std::make_pair(EMS_BAUND_2400,tr("921600")));
|
|
|
|
for (auto it = vbaund.begin(); it != vbaund.end(); it++)
|
|
{
|
|
int id = it->first;
|
|
QString name = it->second;
|
|
|
|
QStandardItem* item = new QStandardItem(name);
|
|
item->setData(id);
|
|
model_baund->appendRow(item);
|
|
}
|
|
|
|
ui->cb_baund->setModel(model_baund);
|
|
ui->cb_baund->setCurrentIndex(2);
|
|
|
|
//设置串口类型
|
|
ui->cb_type->setView(new QListView(this));
|
|
QStandardItemModel* model_type = new QStandardItemModel(this);
|
|
vecPortTypeItemData vporttype;
|
|
vporttype.push_back(std::make_pair(EMS_SERIALPORT_TYPE,tr("Serial Port")));
|
|
|
|
for (auto it = vporttype.begin(); it != vporttype.end(); it++)
|
|
{
|
|
int id = it->first;
|
|
QString name = it->second;
|
|
|
|
QStandardItem* item = new QStandardItem(name);
|
|
item->setData(id);
|
|
model_type->appendRow(item);
|
|
}
|
|
|
|
ui->cb_type->setModel(model_type);
|
|
|
|
//设置串口号
|
|
ui->cb_serialport->setView(new QListView(this));
|
|
|
|
QStandardItemModel* model_serialport = new QStandardItemModel(this);
|
|
|
|
for (int i=0; i < AppData::getInstance()->SerialPortCount ; i++)
|
|
{
|
|
QString name = AppData::getInstance()->SerialPortPrefix + QString("%1").arg(i);
|
|
|
|
QStandardItem* item = new QStandardItem(name);
|
|
//QVariant var = QVariant::fromValue(data);
|
|
item->setData(name);
|
|
model_serialport->appendRow(item);
|
|
}
|
|
|
|
ui->cb_serialport->setModel(model_serialport);
|
|
}
|