400 lines
10 KiB
C++
400 lines
10 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);
|
|
|
|
ui->lcdNumber_temp->setDigitCount(8);
|
|
initFigure();
|
|
|
|
ui->frame_body_status->setAutoFillBackground(true);
|
|
ui->frame_gas_status->setAutoFillBackground(true);
|
|
|
|
QTimer *clock_tmr = new QTimer(this);
|
|
clock_tmr->setTimerType(Qt::PreciseTimer);
|
|
clock_tmr->start();
|
|
connect(clock_tmr, &QTimer::timeout, this, [=]() {
|
|
ui->label_time->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
|
|
});
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
if (m_serialPort->isOpen()) {
|
|
m_serialPort->clear();
|
|
m_serialPort->close();
|
|
qDebug() << "[!] exiting, close and clear 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);
|
|
}
|
|
|
|
uint16_t m_buff = 0x0000;
|
|
|
|
void MainWindow::receiveData() {
|
|
QByteArray msg = m_serialPort->readAll();
|
|
if (msg.isEmpty()) return;
|
|
|
|
QByteArray bufferArray;
|
|
|
|
if(COMPATIBILITY_MODE == 1) {
|
|
for (int i = 0; i < msg.size(); ++i) {
|
|
uint8_t byte = static_cast<uint8_t>(msg.at(i));
|
|
m_buff = ((m_buff << 8) & 0xFF00) | byte;
|
|
bufferArray.append(static_cast<char>((m_buff >> 8) & 0xFF)); // MSB
|
|
bufferArray.append(static_cast<char>(m_buff & 0xFF)); // LSB
|
|
}
|
|
} else {
|
|
bufferArray = msg;
|
|
}
|
|
|
|
qDebug() << "\n[<] received data:" << bufferArray.toHex();
|
|
|
|
uint16_t LSB, MSB;
|
|
|
|
int count = 0;
|
|
if (bufferArray.count() % 2 == 0) {
|
|
count = bufferArray.count() / 2;
|
|
for (int i = 0; i < count; i ++) {
|
|
MSB = ((uchar) bufferArray.at(2 * i)) << 8;
|
|
LSB = (uchar) bufferArray.at(2 * i + 1);
|
|
uint16_t tmp = MSB + LSB;
|
|
uchar t_cmd = tmp >> 12;
|
|
uint16_t t_data = tmp & 0xFFF;
|
|
qDebug() << "CMD: " << t_cmd << "\t DATA: " << t_data;
|
|
|
|
if (t_cmd == MCU_CMD_TEMP) {
|
|
processTempData(t_data);
|
|
}
|
|
if (t_cmd == MCU_CMD_BODY) {
|
|
processBodyData(t_data);
|
|
}
|
|
if (t_cmd == MCU_CMD_GAS_STATE) {
|
|
processGasState(t_data);
|
|
}
|
|
if (t_cmd == MCU_CMD_GAS_DATA) {
|
|
processGasData(t_data);
|
|
}
|
|
}
|
|
} else {
|
|
qDebug() << "\n[!] invalid command received";
|
|
}
|
|
}
|
|
|
|
void MainWindow::initFigure() {
|
|
m_chart = new QChart;
|
|
m_chart->adjustSize();
|
|
m_chartView = new QChartView(m_chart);
|
|
m_chartView->adjustSize();
|
|
m_series = new QLineSeries;
|
|
m_chart->addSeries(m_series);
|
|
|
|
axisX = new QValueAxis;
|
|
axisX->setRange(0, 200);
|
|
axisX->setLabelFormat("%g");
|
|
axisX->setTitleText("采样时刻");
|
|
axisY = new QValueAxis;
|
|
axisY->setRange(0, 50);
|
|
axisY->setTitleText(tr("温度值"));
|
|
|
|
m_chart->setAxisX(axisX, m_series);
|
|
m_chart->setAxisY(axisY, m_series);
|
|
m_chart->legend()->hide();
|
|
m_chart->setTitle(tr("实时温度采集数据"));
|
|
}
|
|
|
|
void MainWindow::processTempData(uint data) {
|
|
static uchar s_flag = 0;
|
|
float computed = 0.0;
|
|
|
|
if (data > 0x800) {
|
|
computed = (0xFFF - data) * (-0.0625);
|
|
} else {
|
|
computed = data * 0.0625;
|
|
}
|
|
|
|
ui->lcdNumber_temp->display(computed);
|
|
|
|
if (s_flag == 0) {
|
|
m_maxTemp = computed;
|
|
m_minTemp = computed;
|
|
s_flag = 1;
|
|
ui->label_max_temp->setText(tr("最高温度: %1 ℃").arg(m_maxTemp));
|
|
ui->label_min_temp->setText(tr("最低温度: %1 ℃").arg(m_minTemp));
|
|
}
|
|
if (computed > m_maxTemp + 0.1) {
|
|
m_maxTemp = computed;
|
|
ui->label_max_temp->setText(tr("最高温度: %1 ℃").arg(m_maxTemp));
|
|
}
|
|
if (computed < m_minTemp - 0.1) {
|
|
m_minTemp = computed;
|
|
ui->label_min_temp->setText(tr("最低温度: %1 ℃").arg(m_minTemp));
|
|
}
|
|
|
|
QVector<QPointF> newPoints;
|
|
QVector<QPointF> oldPoints = m_series->points();
|
|
|
|
if (oldPoints.count() <= (_DISPLAY_DATA_LENGTH_ - 1)) {
|
|
oldPoints.append(QPointF(oldPoints.count(), computed));
|
|
m_series->replace(oldPoints);
|
|
} else {
|
|
for (int i = 0; i < (_DISPLAY_DATA_LENGTH_ - 1); i ++) {
|
|
newPoints.append(QPointF(i, oldPoints.at(i + 1).y()));
|
|
}
|
|
newPoints.append(QPointF(newPoints.count(), computed));
|
|
m_series->replace(newPoints);
|
|
}
|
|
}
|
|
|
|
void MainWindow::processBodyData(uint data) {
|
|
QColor status_color;
|
|
if (data == MCU_CMD_BODY_YES) {
|
|
status_color.setRgb(255, 0, 0);
|
|
ui->frame_body_status->setPalette(status_color);
|
|
}
|
|
if (data == MCU_CMD_BODY_NO) {
|
|
status_color.setRgb(0, 255, 0);
|
|
ui->frame_body_status->setPalette(status_color);
|
|
}
|
|
}
|
|
|
|
void MainWindow::processGasState(uint data) {
|
|
|
|
}
|
|
|
|
void MainWindow::processGasData(uint data) {
|
|
|
|
}
|
|
|
|
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());
|
|
m_serialPort->setPortName(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));
|
|
}
|
|
|
|
|
|
void MainWindow::on_pushButton_temp_details_clicked()
|
|
{
|
|
myDialog *dialog = new myDialog();
|
|
dialog->myWidget->addWidget(m_chartView);
|
|
dialog->exec();
|
|
}
|
|
|
|
|
|
void MainWindow::on_pushButton_clicked()
|
|
{
|
|
ui->comboBox_sys_mode->setCurrentIndex(0);
|
|
ui->comboBox_temp_fetch->setCurrentIndex(0);
|
|
ui->comboBox_body_fetch->setCurrentIndex(0);
|
|
ui->comboBox_sys_mode->setCurrentIndex(2);
|
|
ui->comboBox_temp_fetch->setCurrentIndex(1);
|
|
ui->comboBox_body_fetch->setCurrentIndex(2);
|
|
}
|
|
|