serialicon/mainwindow.cpp
2024-10-26 15:57:27 +08:00

236 lines
5.6 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
m_serialPort = new QSerialPort();
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
if (m_serialPort->isOpen()) {
m_serialPort->clear();
m_serialPort->close();
qDebug() << "exiting, clear and close serial port...";
}
delete m_serialPort;
delete ui;
}
void MainWindow::msgBox(QWidget* ctx, QString title, QString content) {
QMessageBox::information(ctx, title, content);
}
void MainWindow::msgBox(QWidget* ctx, QString content) {
msgBox(ctx, "title", content);
}
void MainWindow::receiveData() {
QByteArray data = m_serialPort->readAll();
qDebug() << "\nreceived data:" << data.length() << data.toHex();
}
void MainWindow::on_btn_serial_search_clicked()
{
QStringList m_serialPortNameList;
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
m_serialPortNameList << info.portName();
qDebug() << "Serial port discovered:" << info.portName();
}
ui->comboBox_serial->clear();
ui->comboBox_serial->addItems(m_serialPortNameList);
if (m_serialPortNameList.length() > 0) {
ui->comboBox_serial->setCurrentIndex(0);
}
}
void MainWindow::on_btn_serial_toggle_clicked()
{
if (ui->comboBox_serial->currentText() == "") {
msgBox(this, "请选择串口");
return;
}
if (m_serialPort->isOpen()) {
m_serialPort->clear();
m_serialPort->close();
qDebug() << "Serial port closed";
ui->btn_serial_toggle->setText("打开串口");
// enable serial port comboBoxes
ui->comboBox_serial->setDisabled(false);
ui->comboBox_baud->setDisabled(false);
ui->btn_serial_search->setDisabled(false);
} else {
m_serialPort->setPortName("/dev/" + ui->comboBox_serial->currentText());
if (!m_serialPort->open(QIODevice::ReadWrite)) {
msgBox(this, "串口打开失败", "串口被占用或不存在");
qDebug() << "Serial open failed";
return;
}
qDebug() << "Serial open successful";
ui->btn_serial_toggle->setText("关闭串口");
// handle baud rate
QSerialPort::BaudRate t_BaudRate;
switch (ui->comboBox_baud->currentIndex()) {
case 0:
t_BaudRate = QSerialPort::Baud2400;
break;
case 1:
t_BaudRate = QSerialPort::Baud4800;
break;
case 2:
t_BaudRate = QSerialPort::Baud9600;
break;
case 3:
t_BaudRate = QSerialPort::Baud115200;
break;
default:
t_BaudRate = QSerialPort::Baud9600;
break;
}
// serial port configuration
m_serialPort->setBaudRate(t_BaudRate);
m_serialPort->setDataBits(QSerialPort::Data8);
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
m_serialPort->setParity(QSerialPort::NoParity);
m_serialPort->setStopBits(QSerialPort::OneStop);
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(receiveData()));
// disable serial port comboBoxes
ui->comboBox_serial->setDisabled(true);
ui->comboBox_baud->setDisabled(true);
ui->btn_serial_search->setDisabled(true);
}
}
void MainWindow::on_comboBox_sys_mode_currentIndexChanged(int index)
{
static char buff = 0xff;
switch (index) {
case 0:
buff = CTRL_CODE_SYSMODE_Disable;
break;
case 1:
buff = CTRL_CODE_SYSMODE_Telemetry;
break;
case 2:
buff = CTRL_CODE_SYSMODE_Security;
break;
}
if (!m_serialPort->isOpen()) {
msgBox(this, "未连接设备");
return;
}
m_serialPort->write(&buff, sizeof(buff));
}
void MainWindow::on_comboBox_cycle_currentIndexChanged(int index)
{
static char buff = 0xff;
switch (index) {
case 0:
buff = CTRL_CODE_CYCLE_500ms;
break;
case 1:
buff = CTRL_CODE_CYCLE_1s;
break;
case 2:
buff = CTRL_CODE_CYCLE_2s;
break;
case 3:
buff = CTRL_CODE_CYCLE_5s;
break;
}
if (!m_serialPort->isOpen()) {
msgBox(this, "未连接设备");
return;
}
m_serialPort->write(&buff, sizeof(buff));
}
void MainWindow::on_comboBox_temp_fetch_currentIndexChanged(int index)
{
static char buff = 0xff;
switch (index) {
case 0:
buff = CTRL_CODE_TEMP_Disable;
break;
case 1:
buff = CTRL_CODE_TEMP_Enable;
break;
}
if (!m_serialPort->isOpen()) {
msgBox(this, "未连接设备");
return;
}
m_serialPort->write(&buff, sizeof(buff));
}
void MainWindow::on_comboBox_body_fetch_currentIndexChanged(int index)
{
static char buff = 0xff;
switch (index) {
case 0:
buff = CTRL_CODE_BODY_Disable;
break;
case 1:
buff = CTRL_CODE_BODY_Buzzer;
break;
case 2:
buff = CTRL_CODE_BODY_Light;
break;
}
if (!m_serialPort->isOpen()) {
msgBox(this, "未连接设备");
return;
}
m_serialPort->write(&buff, sizeof(buff));
}
void MainWindow::on_comboBox_gas_fetch_currentIndexChanged(int index)
{
static char buff = 0xff;
switch (index) {
case 0:
buff = CTRL_CODE_GAS_Disable;
break;
case 1:
buff = CTRL_CODE_GAS_State;
break;
case 2:
buff = CTRL_CODE_GAS_Data;
break;
}
if (!m_serialPort->isOpen()) {
msgBox(this, "未连接设备");
return;
}
m_serialPort->write(&buff, sizeof(buff));
}