-#include "mainwindow.h"\r
-#include "ui_mainwindow.h"\r
-#include "dialogsettings.h"\r
-#include <QDesktopServices>\r
-#include <qserialport.h>\r
-// 初始化线程、状态寄存器、配置信息\r
-MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)\r
-{\r
- ui->setupUi(this);\r
- serialport1 = new QSerialPort(this);\r
- serialport2 = new QSerialPort(this);\r
- serialport3 = new QSerialPort(this);\r
- serialport4 = new QSerialPort(this);\r
-\r
- spp_timer_handle1 = new QTimer(this);\r
- connect(spp_timer_handle1, SIGNAL(timeout()), this, SLOT(spp_timer_callback1()));\r
-\r
- result_thread1 = new Result_Thread(this,1);\r
- result_thread2 = new Result_Thread(this,2);\r
- result_thread3 = new Result_Thread(this,3);\r
- result_thread4 = new Result_Thread(this,4);\r
- result_thread1->start();\r
- result_thread1->pause();\r
- result_thread2->start();\r
- result_thread2->pause();\r
- result_thread3->start();\r
- result_thread3->pause();\r
- result_thread4->start();\r
- result_thread4->pause();\r
- ui_setting_read();\r
-\r
-}\r
-\r
-void MainWindow::ui_show_result1(QString msg,bool success)\r
-{\r
- ui->label_runtime_status1->setText(msg);\r
- if (success)\r
- {\r
- this->write_success_count1++;\r
- ui->label_result_success1->setText(QString::fromLocal8Bit("成功%1").arg(write_success_count1));\r
- waiting_cmd1=false;\r
- }else{\r
- this->write_fail_count1++;\r
- ui->label_result_fail1->setText(QString::fromLocal8Bit("失败%1").arg(write_fail_count1));\r
- poweroff_watch1();\r
- }\r
- if (spp_timer_handle1->isActive())\r
- spp_timer_handle1->stop();\r
-\r
-}\r
-\r
-void MainWindow::readData1()\r
-{\r
- const QByteArray data = serialport1->readAll();\r
-// qDebug()<<uart_rx_flag1;\r
- if(uart_rx_flag1)\r
- qDebug()<<data;\r
-\r
-if (working_state_1 == false)\r
-{\r
- qDebug()<<"写号结束,跳过读取串口";\r
- return;\r
- }\r
- if (data.indexOf(BOOT_UP_MSG)>=0)\r
- {\r
- this->ui->label_runtime_status1->setText(QString::fromLocal8Bit("发现新设备"));\r
- waiting_cmd1 = true;\r
- cmd_index_1 = 0;\r
- QString avalible_mac = settings::getInstance().getAvalibleMac();\r
- ui->ledit_spp_addr_1->setText(avalible_mac);\r
- ui->txtb_dispaly->clear();\r
- }\r
- if (waiting_cmd1 && data.indexOf(TIME_FOR_CMD)>=0)\r
- {\r
- uart_send_data1(ATCMD_ADD_VOTE);\r
- }\r
-\r
- if (uart_rx_flag1)\r
- {//指令下达完毕,开始接收数据\r
- uart_rx_buff_array1.append(data);\r
- if (uart_rx_buff_array1.indexOf("OK~")>=0 || uart_rx_buff_array1.indexOf("power off device!")>=0)\r
- {\r
- uart_rx_flag1 = false;\r
- uart_process1();//开始处理当前指令结果\r
-if (cmd_index_1 <0)\r
- {\r
- if (spp_timer_handle1->isActive())\r
- spp_timer_handle1->stop();\r
-\r
- if (uart_rx_buff_array1.indexOf("power off device") >= 0 )\r
- {\r
- ui_display1(QString::fromLocal8Bit("关机成功\r\n"),LOG_DIRECT_IN);\r
-}\r
- return;\r
- }\r
- cmd_index_1 ++; //开始执行下一指令\r
- qDebug()<<"next cmdindex "<<cmd_index_1;\r
-switch(cmd_index_1){\r
- case 0:\r
- {\r
-\r
- }\r
- case 1:\r
- {\r
- this->uart_send_data1(ATCMD_GET_MAC);\r
- }\r
- break;\r
- case 2:\r
- {\r
- QString set_mac_cmd=QString(ATCMD_SET_MAC).arg(ui->ledit_spp_addr_1->text());\r
- this->uart_send_data1(set_mac_cmd);\r
- }\r
- break;\r
- case 3:\r
- {\r
- this->uart_send_data1(ATCMD_GET_MAC);\r
- }\r
- break;\r
- case 4:\r
- {\r
- this->uart_send_data1(ATCMD_GET_CPUID);\r
- }\r
- break;\r
- case 5:\r
- {\r
- this->uart_send_data1(ATCMD_POWEROFF);\r
- }\r
- break;\r
- default:\r
- {\r
- cmd_index_1=-1;\r
- if (spp_timer_handle1->isActive())\r
- spp_timer_handle1->stop();\r
- }\r
- break;\r
- }\r
- }\r
- else{\r
-\r
- }\r
- }\r
-\r
-\r
-\r
-// m_timer->stop();\r
-\r
-\r
-\r
-// {\r
-// ui_display1(data,false);\r
-// }\r
-// m_console->putData(data);\r
-}\r
-void MainWindow::readData2()\r
-{\r
- const QByteArray data = serialport2->readAll();\r
- qDebug()<<data;\r
-// m_console->putData(data);\r
-}\r
-void MainWindow::readData3()\r
-{\r
- const QByteArray data = serialport3->readAll();\r
- qDebug()<<data;\r
-// m_console->putData(data);\r
-}\r
-void MainWindow::readData4()\r
-{\r
- const QByteArray data = serialport4->readAll();\r
- qDebug()<<data;\r
-// m_console->putData(data);\r
-}\r
-// 结束线程\r
-MainWindow::~MainWindow()\r
-{\r
- if (spp_timer_handle1 != nullptr) {\r
- spp_timer_handle1->stop();\r
- spp_timer_handle1 = nullptr;\r
- }\r
-// if (spp_connected_handle != nullptr) {\r
-// spp_connected_handle->stop();\r
-// spp_connected_handle = nullptr;\r
-// }\r
- ui_setting_save();\r
- result_thread1->stop();\r
- result_thread1->wait();\r
- result_thread2->stop();\r
- result_thread2->wait();\r
- result_thread3->stop();\r
- result_thread3->wait();\r
- result_thread4->stop();\r
- result_thread4->wait();\r
-\r
-\r
- delete result_thread1;\r
- delete result_thread2;\r
- delete result_thread3;\r
- delete result_thread4;\r
- delete ui;\r
-}\r
-void MainWindow::poweroff_watch1()\r
-{\r
-// cmd_index_1 = 4; //直接执行关机\r
- this->uart_send_data1(ATCMD_POWEROFF);\r
-}\r
-\r
-void MainWindow::ui_display1(QString str,bool inOrOut)\r
-{\r
-\r
- ui->txtb_dispaly->moveCursor(QTextCursor::End);\r
- if(inOrOut){\r
- ui->txtb_dispaly->setTextColor(QColor(127, 255, 0));\r
- }else{\r
- ui->txtb_dispaly->setTextColor(Qt::red);\r
- } \r
- ui->txtb_dispaly->insertPlainText(str);\r
- ui->txtb_dispaly->moveCursor(QTextCursor::End);\r
-}\r
-void MainWindow::ui_display2(QString str,bool inOrOut)\r
-{\r
-// QTime Time= QTime::currentTime();//获取系统当前的时间\r
-// QString str_time = Time.toString("[hh:mm:ss ");//格式化时间\r
- ui->txtb_dispaly_2->moveCursor(QTextCursor::End);\r
- if(inOrOut){\r
- ui->txtb_dispaly_2->setTextColor(QColor(127, 255, 0));\r
- }else{\r
- ui->txtb_dispaly_2->setTextColor(Qt::red);\r
- }\r
-// if(inOrOut){\r
-// str_time.append("IN] : ");\r
-// }else{\r
-// str_time.append("OUT] : ");\r
-// }\r
-// str.prepend(str_time);\r
-// str+="\r\n";\r
- ui->txtb_dispaly_2->insertPlainText(str);\r
- ui->txtb_dispaly_2->moveCursor(QTextCursor::End);\r
-}\r
-void MainWindow::ui_display3(QString str,bool inOrOut)\r
-{\r
-// QTime Time= QTime::currentTime();//获取系统当前的时间\r
-// QString str_time = Time.toString("[hh:mm:ss ");//格式化时间\r
- ui->txtb_dispaly_3->moveCursor(QTextCursor::End);\r
- if(inOrOut){\r
- ui->txtb_dispaly_3->setTextColor(QColor(127, 255, 0));\r
- }else{\r
- ui->txtb_dispaly_3->setTextColor(Qt::red);\r
- }\r
-// if(inOrOut){\r
-// str_time.append("IN] : ");\r
-// }else{\r
-// str_time.append("OUT] : ");\r
-// }\r
-// str.prepend(str_time);\r
-// str+="\r\n";\r
- ui->txtb_dispaly_3->insertPlainText(str);\r
- ui->txtb_dispaly_3->moveCursor(QTextCursor::End);\r
-}\r
-void MainWindow::ui_display4(QString str,bool inOrOut)\r
-{\r
-// QTime Time= QTime::currentTime();//获取系统当前的时间\r
-// QString str_time = Time.toString("[hh:mm:ss ");//格式化时间\r
- ui->txtb_dispaly_4->moveCursor(QTextCursor::End);\r
- if(inOrOut){\r
- ui->txtb_dispaly_4->setTextColor(QColor(127, 255, 0));\r
- }else{\r
- ui->txtb_dispaly_4->setTextColor(Qt::red);\r
- }\r
-// if(inOrOut){\r
-// str_time.append("IN] : ");\r
-// }else{\r
-// str_time.append("OUT] : ");\r
-// }\r
-// str.prepend(str_time);\r
-// str+="\r\n";\r
- ui->txtb_dispaly_4->insertPlainText(str);\r
- ui->txtb_dispaly_4->moveCursor(QTextCursor::End);\r
-}\r
-\r
-void MainWindow::ui_save_windows()\r
-{\r
- QString fname = QFileDialog::getExistingDirectory(this, "请选择文件");\r
- QFile file(fname+"/save.txt");\r
- if (!file.open(QFile::WriteOnly | QFile::Text)) //检测文件是否打开\r
- {\r
- QMessageBox::information(this, "Error Message", "Please Select a Text File!");\r
- return;\r
- }\r
-\r
- QTextStream out(&file); //分行写入文件\r
- out << ui->txtb_dispaly->toPlainText(); //这里的File_edit就是之前声明的Textedit控件的名字\r
-}\r
-// 存储config配置文件\r
-void MainWindow::ui_setting_save()\r
-{\r
- QSettings *settings = new QSettings("Setting.ini", QSettings::IniFormat);\r
-\r
- // 写入第一组数据\r
- settings->beginGroup("Uart_setting");\r
- settings->setValue("uart_com", ui->cbox_uart_com_select_1->currentText());\r
- settings->setValue("uart_baud", ui->cbox_uart_baud_select->currentIndex());\r
-// settings->setValue("spp_addr", ui->ledit_spp_addr->text());\r
- settings->sync();\r
- settings->endGroup();\r
- delete settings;\r
- settings = nullptr;\r
-}\r
-// 读取config配置\r
-void MainWindow::ui_setting_read()\r
-{\r
- uart_com_select();\r
- QSettings *msettings = new QSettings("Setting.ini", QSettings::IniFormat);\r
- ui->cbox_uart_com_select_1->ChangeItem(msettings->value("Uart_setting/uart_com").toString());\r
- ui->cbox_uart_baud_select->setCurrentIndex(msettings->value("Uart_setting/uart_baud").toInt());\r
-\r
- settings::getInstance().load_settings();\r
- ui->textBrowser_result->setText(settings::getInstance().getmacStatusFull());\r
-\r
-}\r
-\r
-\r
-/* --------------------------------uart操作--------------------------- */\r
-void MainWindow::uart_process1()\r
-{\r
- qDebug()<<"uart_process1 "<< cmd_index_1;\r
- //处理指令结果\r
- switch(cmd_index_1){\r
- case 0:\r
- ui_display1(QString::fromLocal8Bit("阻止休眠\r\n"),LOG_DIRECT_IN);\r
- qDebug()<<"阻止休眠";\r
- break;\r
- case 1:\r
- {\r
- //检查当前的号是否已经是写过的号,放置重复写号造成的浪费。\r
- int ret = uart_rx_buff_array1.indexOf(tr("28*****"));\r
- if (ret >= 0)\r
- {\r
- QString unit="281106"+uart_rx_buff_array1.mid(ret+7,6);\r
- bool mac_used=settings::getInstance().getMacUsed(unit.toUpper());\r
- if (mac_used)\r
- {\r
- ui_display1(QString::fromLocal8Bit("手表地址")+unit+QString::fromLocal8Bit("已占用\r\n"),LOG_DIRECT_OUT);\r
- ui_show_result1(QString::fromLocal8Bit("Mac地址已占用"),false);\r
- cmd_index_1 = -1;\r
-\r
-\r
- }else{\r
- ui_display1(QString::fromLocal8Bit("手表地址")+unit+QString::fromLocal8Bit(" 可用!\r\n"),LOG_DIRECT_IN);\r
- }\r
-\r
- }else{\r
- ui_display1(QString::fromLocal8Bit("查询手表Mac失败!\r\n"),LOG_DIRECT_OUT);\r
- cmd_index_1 = -1;\r
- ui_show_result1(QString::fromLocal8Bit("查询手表Mac失败"),false);\r
- }\r
-\r
- }\r
- break;\r
- case 2:\r
- ui_display1(QString::fromLocal8Bit("执行设置地址\r\n"),LOG_DIRECT_IN);\r
- break;\r
- case 3:\r
- {\r
-// local_addr : 28*****010101\r
- QString unit=ui->ledit_spp_addr_1->text();\r
- int ret = uart_rx_buff_array1.indexOf(tr("28*****"));\r
- if (ret >= 0)\r
- {\r
- QString unit_watch="281106"+uart_rx_buff_array1.mid(ret+7,6);\r
- qDebug()<<unit_watch;\r
- qDebug()<<unit;\r
- if(unit_watch.toUpper() == unit)\r
- {\r
- ui_display1(QString::fromLocal8Bit("设置Mac")+unit_watch+QString::fromLocal8Bit("成功\r\n"),LOG_DIRECT_IN);\r
- }else{\r
- ui_display1(QString::fromLocal8Bit("设置Mac")+unit_watch+QString::fromLocal8Bit("失败\r\n"),LOG_DIRECT_OUT);\r
- cmd_index_1 = -2;\r
- ui_show_result1(QString::fromLocal8Bit("Mac地址已占用"),false);\r
- }\r
-\r
- }else{\r
- ui_display1(QString::fromLocal8Bit("设置Mac")+unit+QString::fromLocal8Bit("失败\r\n"),LOG_DIRECT_OUT);\r
- cmd_index_1 = -3;\r
- ui_show_result1(QString::fromLocal8Bit("查询手表Mac失败"),false);\r
- }\r
-\r
- }\r
- break;\r
- case 4:\r
- {\r
- int ret = uart_rx_buff_array1.indexOf("[soc id:]");\r
- {\r
- if (ret >= 0 )\r
- {\r
- if (uart_rx_buff_array1.size()-ret >84){\r
- QString cpu_id=uart_rx_buff_array1.mid(ret+9,84).replace("\r\n","").replace("0x","").replace(" ","");\r
- ui_display1("cpuid: "+cpu_id+"\r\n",LOG_DIRECT_IN);\r
- ret = settings::getInstance().set_mac_used(ui->ledit_spp_addr_1->text(),cpu_id,true);\r
- qDebug()<<"set mac used "<<ui->ledit_spp_addr_1->text()<<" "<< cpu_id<<" ret "<<ret ;\r
- if (ret == 1)\r
- {\r
- ui->textBrowser_result->setText(settings::getInstance().getmacStatusFull());\r
- ui_display1(QString::fromLocal8Bit("设置mac成功\r\n"),LOG_DIRECT_IN);\r
- }else{\r
- ui_show_result1(QString::fromLocal8Bit("获取cpuid失败\r\n"),false);\r
- }\r
- }\r
-\r
- }else{\r
- ui_display1(QString::fromLocal8Bit("获取cpuid失败\r\n"),LOG_DIRECT_OUT);\r
- cmd_index_1 = -4;\r
- ui_show_result1(QString::fromLocal8Bit("获取cpuid失败\r\n"),false);\r
- }\r
- }\r
- }\r
- break;\r
- case 5:\r
- {\r
- int ret = uart_rx_buff_array1.indexOf("power off device");\r
- if (ret >= 0 )\r
- {\r
- ui_display1(QString::fromLocal8Bit("关机成功\r\n"),LOG_DIRECT_IN);\r
- }else{\r
- ui_display1(QString::fromLocal8Bit("关机失败\r\n"),LOG_DIRECT_OUT);\r
- }\r
- ui_show_result1(QString::fromLocal8Bit("设置mac成功\r\n"),true);\r
-\r
- }\r
- break;\r
- default:\r
- {\r
- cmd_index_1=-1;\r
- }\r
- break;\r
- }\r
-}\r
-void MainWindow::uart_process2()\r
-{\r
-// if (ui->pbtn_open_uart->isChecked()) {\r
- QString str_com = ui->cbox_uart_com_select_1->currentText();\r
- QString str_uart_baud = ui->cbox_uart_baud_select->currentText();\r
-// uart_open(str_com,str_uart_baud);\r
-// } else {\r
-// uart_close();\r
-// }\r
-}\r
-void MainWindow::uart_process3()\r
-{\r
-// if (ui->pbtn_open_uart->isChecked()) {\r
- QString str_com = ui->cbox_uart_com_select_1->currentText();\r
- QString str_uart_baud = ui->cbox_uart_baud_select->currentText();\r
-// uart_open(str_com,str_uart_baud);\r
-// } else {\r
-// uart_close();\r
-// }\r
-}\r
-void MainWindow::uart_process4()\r
-{\r
-// if (ui->pbtn_open_uart->isChecked()) {\r
- QString str_com = ui->cbox_uart_com_select_1->currentText();\r
- QString str_uart_baud = ui->cbox_uart_baud_select->currentText();\r
-// uart_open(str_com,str_uart_baud);\r
-// } else {\r
-// uart_close();\r
-// }\r
-}\r
-//void MainWindow::uart_open(QString com,QString com_baud)\r
-//{\r
-\r
-//}\r
-//void MainWindow::uart_close()\r
-//{\r
-\r
-//}\r
-void MainWindow::uart_send_data1(QString cmd)\r
-{\r
- qint64 ret =0;\r
- qDebug()<<"uart_send_data1 "<<cmd;\r
- ret=serialport1->write(cmd.toUtf8());\r
- m_bytesToWrite1 = ret;\r
- qDebug()<<"uart_send_data1 "<<cmd << " ret "<<m_bytesToWrite1;\r
- G_cmd=cmd;\r
- if (spp_timer_handle1->isActive())\r
- spp_timer_handle1->stop();\r
- spp_timer_handle1->start(1500);\r
-// ui_display1(cmd,true);\r
-// 发送指令,在发送结束的handleBytesWritten1中,设置接收状态,\r
-// 接收函数 readData1 中确认指令是否执行完毕,然后执行下一个指令。\r
-}\r
-void MainWindow::uart_send_data2(QString cmd)\r
-{\r
-\r
-}\r
-void MainWindow::uart_send_data3(QString cmd)\r
-{\r
-\r
-}\r
-void MainWindow::uart_send_data4(QString cmd)\r
-{\r
-\r
-}\r
-// uart收到的数据进行回显到显示栏\r
-void MainWindow::uart_rx_dispaly1(int buf_len, u8Piont buf)\r
-{\r
- uart_rx_flag1 = true;\r
- if (uart_rx_Ignoring_display) {\r
- QString str((char *)buf);\r
- if(str.contains("ADDR")){\r
-// ui->ledit_dongle_mac->setText(str.mid(str.indexOf("=",0)+1,12));\r
- }\r
- return;\r
- }\r
- QString str;\r
- QByteArray data((const char*)buf, buf_len);\r
-// if (ui->ckbox_Hex_Display->isChecked()) {\r
-// for (int i = 0; i < data.size(); i++) {\r
-// str += QString("%1 ").arg((quint8)data.at(i), 2, 16, QChar('0'));\r
-// }\r
-// str=str.toUpper();\r
-// } else {\r
-// for (int i = 0; i < data.size(); i++) {\r
-// str += QString(data.at(i));\r
-// }\r
-// }\r
- ui_display1(str,true);\r
- free(buf);\r
-}\r
-\r
-void MainWindow::uart_com_select()\r
-{\r
- ui->cbox_uart_com_select_1->clear();\r
- QStringList strlist = uart_get_enable_comm_or_port();\r
- qSort(strlist.begin(), strlist.end(),[](const QString& s1, const QString& s2){\r
- QString a1=s1;QString a2=s2;\r
- return a1.replace("COM","").toInt() < a2.replace("COM","").toInt(); });\r
- ui->cbox_uart_com_select_1->addItems(strlist);\r
-}\r
-void MainWindow::uart_com_switch(QString com)\r
-{\r
- QString str_uart_baud = ui->cbox_uart_baud_select->currentText();\r
-\r
-}\r
-void MainWindow::uart_baud_switch(QString baud)\r
-{\r
- QString str_com = ui->cbox_uart_com_select_1->currentText();\r
-\r
-}\r
-// nIndex为索引号 bValue选择返回值为key还是value,默认为value\r
-QString MainWindow::uart_get_comm_or_port(int nIndex, bool bValue)\r
-{\r
- QString strCommRet = QObject::tr("");\r
- HKEY hKey;\r
- if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0) {\r
- QMessageBox::warning(this, tr("Register"), tr("can't open register"),QMessageBox::Ok);\r
- return QObject::tr(""); // 无法打开注册表\r
- }\r
- QString strKeyMsg; // 键名\r
- QString strValueMsg; // 键值\r
- TCHAR portName[256]; // 键名数组\r
- TCHAR commName[256]; // 键值数组\r
- ulong nKeySize = sizeof(portName);\r
- ulong nValueSize = sizeof(commName);\r
- ulong nType;\r
- memset(commName,0,sizeof(commName));\r
- memset(portName,0,sizeof(portName));\r
- if (::RegEnumValue(hKey, nIndex, portName, &nKeySize, 0, &nType, (BYTE *)commName, &nValueSize) == 0) { // 列举键名\r
- // 读取键名\r
- for (uint i = 0; i < nKeySize; i++) {\r
- if (portName[i] != 0x00)\r
- strKeyMsg.append(portName[i]);\r
- }\r
- // 读取键值\r
- for (uint j = 0; j < nValueSize; j++) {\r
- if (commName[j] != 0x00)\r
- strValueMsg.append(commName[j]);\r
- }\r
- if (bValue)\r
- strCommRet = strValueMsg;\r
- else\r
- strCommRet = strKeyMsg;\r
- } else {\r
- ::RegCloseKey(hKey); // 关闭注册表\r
- return QObject::tr(""); // 无可用串口\r
- }\r
- return strCommRet;\r
-}\r
-void MainWindow::openLogfolder()\r
-{\r
- QString path = QCoreApplication::applicationDirPath();\r
- QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );\r
-}\r
-\r
-QStringList MainWindow::uart_get_enable_comm_or_port()\r
-{\r
- QStringList CommPortList;\r
- QString strCommPath = QObject::tr("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM");\r
- QSettings *settings = new QSettings(strCommPath, QSettings::NativeFormat);\r
- QStringList keyList = settings->allKeys();\r
- if (!keyList.isEmpty()) {\r
- for (int i = 0; i < keyList.count(); i++)\r
- CommPortList.append(uart_get_comm_or_port(i, true));\r
- }\r
- return CommPortList;\r
-}\r
-\r
-/* ------------------------------------------------------------------- */\r
-void MainWindow::spp_connected_callback()\r
-{\r
- ui_display1("com send cmd failed! ",false);\r
-}\r
-void MainWindow::spp_timer_callback2()\r
-{\r
-\r
-}\r
-void MainWindow::spp_timer_callback3()\r
-{\r
-\r
-}\r
-void MainWindow::spp_timer_callback4()\r
-{\r
-\r
-}\r
-\r
-void MainWindow::spp_timer_callback1()\r
-{\r
- uart_rx_flag1 = false;\r
-// ui_display1(ui->cbox_uart_com_select_1->currentText()+QString::fromLocal8Bit("AT指令指令超时!\r\n"),false);\r
- if(G_cmd==ATCMD_ADD_VOTE)\r
- {\r
- this->uart_send_data1(ATCMD_ADD_VOTE);\r
- }\r
- else\r
- {\r
- ui_display1(QString::fromLocal8Bit(G_cmd.toStdString().c_str()),false);\r
- if (spp_timer_handle1->isActive())\r
- spp_timer_handle1->stop();\r
- }\r
-\r
-\r
-}\r
-\r
-\r
-void MainWindow::spp_connect_1()\r
-{\r
- if (working_state_1 == false)\r
- {\r
- QString baud_rate = ui->cbox_uart_baud_select->currentText();\r
- QString com_name = ui->cbox_uart_com_select_1->currentText();\r
-\r
- serialport1->setPortName(com_name);\r
- serialport1->setBaudRate(baud_rate.toInt());\r
- serialport1->setDataBits(QSerialPort::DataBits::Data8);\r
- serialport1->setParity(QSerialPort::Parity::NoParity);\r
- serialport1->setStopBits(QSerialPort::StopBits::OneStop);\r
- serialport1->setFlowControl(QSerialPort::FlowControl::NoFlowControl);\r
-\r
- ui->txtb_dispaly->clear();\r
- if (serialport1->isOpen())\r
- {\r
- this->cmd_index_1 = 0;\r
-// this->uart_send_data1(ATCMD_GET_MAC);\r
-\r
- //\r
- }else{\r
- if (serialport1->open(QIODevice::ReadWrite)) {\r
- // serialport1->setEnabled(true);\r
- // serialport1->setLocalEchoEnabled(false);\r
-\r
- connect(serialport1, &QSerialPort::readyRead, this, &MainWindow::readData1);\r
- connect(serialport1, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten1);\r
-this->cmd_index_1 = 0;\r
-// this->uart_send_data1(ATCMD_GET_MAC);\r
- // serialport1->close();\r
- // disconnect(serialport1, &QSerialPort::readyRead, this, &MainWindow::readData1);\r
-\r
- } else {\r
- QMessageBox::critical(this, tr("Error"), serialport1->errorString());\r
-\r
- ui_display1(tr("Open error\r\n"),false);\r
- return;\r
- }\r
- }\r
-\r
- // 开始工作\r
- working_state_1 = true;\r
- write_fail_count1= 0;\r
- write_success_count1 =0;\r
- ui->label_result_fail1->setText(QString::fromLocal8Bit("失败%1").arg(write_fail_count1));\r
- ui->label_result_success1->setText(QString::fromLocal8Bit("成功%1").arg(write_success_count1));\r
- ui->pbtn_spp_reconnect_1->setText(QString::fromLocal8Bit("停止写地址"));\r
-ui->label_runtime_status1->setText(QString::fromLocal8Bit("等待手表开机"));\r
-\r
-// QString avalible_mac = settings::getInstance().getAvalibleMac();\r
-// ui->ledit_spp_addr_1->setText(avalible_mac);\r
-// int ret =0;\r
- // ret = settings::getInstance().set_mac_used(avalible_mac,"",true);\r
-\r
- // qDebug()<< "set mac "<< avalible_mac<<" used , ret "<< ret;\r
-\r
-\r
- qDebug()<<settings::getInstance().getmacStatusFull();\r
-\r
-\r
-\r
- }else{\r
- //停止工作\r
- ui->pbtn_spp_reconnect_1->setText(QString::fromLocal8Bit("开始写地址"));\r
- ui->label_runtime_status1->setText(QString::fromLocal8Bit("已停止写地址..."));\r
- working_state_1 = false;\r
- ui->txtb_dispaly->clear();\r
- if(serialport1->isOpen())\r
- serialport1->close();\r
- disconnect(serialport1, &QSerialPort::readyRead, this, &MainWindow::readData1);\r
- disconnect(serialport1, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten1);\r
-\r
-\r
- }\r
- \r
-\r
-// this->serialport1->setBaudRate()\r
-// ui_display1("connect com1 ",false);\r
-}\r
-\r
-\r
-void MainWindow::handleBytesWritten1(qint64 bytes)\r
-{\r
- qDebug()<<" handleBytesWritten1 m_bytesToWrite1 "<<m_bytesToWrite1<<" written " <<bytes;\r
- m_bytesToWrite1 -= bytes;\r
- if (m_bytesToWrite1 == 0)\r
- {\r
- uart_rx_flag1 = true;\r
- uart_rx_buff_array1.clear();\r
- }\r
-}\r
-void MainWindow::spp_connect_2()\r
-{\r
- ui_display2("connect com1 ",false);\r
-\r
-}\r
-void MainWindow::spp_connect_3()\r
-{\r
- ui_display3("connect com1 ",false);\r
-\r
-}\r
-void MainWindow::spp_connect_4()\r
-{\r
- ui_display4("connect com1 ",false);\r
-\r
-}\r
-\r
-void MainWindow::spp_connect_all()\r
-{\r
- uart_rx_Ignoring_display = true;\r
-// dongle_is_connected = false;\r
-// dongle_try_count = 0;\r
-// spp_try_count = 0;\r
-// uapi_uart_callback_register(uart_callback);\r
-// at_handler->at_send_cmd_board(DONGLE_MODE_ADDR,NULL);\r
- ui_display1("spp connectting...",false);\r
-\r
- // spp查询定时器周期为1500ms\r
- spp_timer_handle1->start(1500);\r
-// ui->pbtn_spp_connect->setEnabled(false);\r
-}\r
-\r
-//void MainWindow::at_check_send_status(bool flag)\r
-//{\r
-// if(flag){\r
-// ui_display1("at cmd send success.\r\n",false);\r
-// }else{\r
-// QMessageBox::warning(this, tr("AT"), tr("AT send fail!\r\n"), QMessageBox::Ok);\r
-// ui_display1("at cmd send fail.\r\n",false);\r
-// }\r
-//}\r
-\r
-void MainWindow::ui_open_mac_config()\r
-{\r
- DialogSettings *diag=new DialogSettings();\r
-\r
- diag->show();\r
-\r
-}\r
-/* ----------------------------------------------------------------------------------- */\r
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "dialogsettings.h"
+#include <QDesktopServices>
+#include <qserialport.h>
+// 初始化线程、状态寄存器、配置信息
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+ serialport1 = new QSerialPort(this);
+ serialport2 = new QSerialPort(this);
+ serialport3 = new QSerialPort(this);
+ serialport4 = new QSerialPort(this);
+
+ spp_timer_handle1 = new QTimer(this);
+ connect(spp_timer_handle1, SIGNAL(timeout()), this, SLOT(spp_timer_callback1()));
+
+ result_thread1 = new Result_Thread(this,1);
+ result_thread2 = new Result_Thread(this,2);
+ result_thread3 = new Result_Thread(this,3);
+ result_thread4 = new Result_Thread(this,4);
+ result_thread1->start();
+ result_thread1->pause();
+ result_thread2->start();
+ result_thread2->pause();
+ result_thread3->start();
+ result_thread3->pause();
+ result_thread4->start();
+ result_thread4->pause();
+ ui_setting_read();
+
+}
+
+void MainWindow::ui_show_result1(QString msg,bool success)
+{
+ ui->label_runtime_status1->setText(msg);
+ if (success)
+ {
+ this->write_success_count1++;
+ ui->label_result_success1->setText(tr("成功%1").arg(write_success_count1));
+ }else{
+ this->write_fail_count1++;
+ ui->label_result_fail1->setText(tr("失败%1").arg(write_fail_count1));
+ poweroff_watch1();
+ }
+ if (spp_timer_handle1->isActive())
+ spp_timer_handle1->stop();
+
+}
+
+void MainWindow::readData1()
+{
+ const QByteArray data = serialport1->readAll();
+// qDebug()<<uart_rx_flag1;
+ if(uart_rx_flag1)
+ qDebug()<<data;
+
+if (working_state_1 == false)
+{
+ qDebug() << tr("写号结束,跳过读取串口");
+ return;
+ }
+
+ // 记录串口接收到的数据
+ if (!data.isEmpty()) {
+ QString dataStr = QString::fromUtf8(data);
+ }
+
+ // 将新数据添加到开机检测缓存中
+ boot_detect_buffer.append(data);
+
+ // 保持缓存大小合理,避免内存过度使用(保留最近8192字节)
+ if (boot_detect_buffer.length() > 8192) {
+ boot_detect_buffer = boot_detect_buffer.right(8192);
+ // 只在第一次超过限制时打印,避免重复打印
+ static bool buffer_limit_warned = false;
+ if (!buffer_limit_warned) {
+ qDebug() << tr("开机检测缓存过大,保留最近8192字节");
+ buffer_limit_warned = true;
+ }
+ }
+ // 在缓存区中检测开机信号,处理分包情况
+ if (boot_detect_buffer.indexOf(BOOT_UP_MSG)>=0)
+ {
+ this->ui->label_runtime_status1->setText(tr("发现新设备"));
+ waiting_cmd1 = true;
+ cmd_index_1 = 0;
+ QString avalible_mac = settings::getInstance().getAvalibleMac();
+ ui->ledit_spp_addr_1->setText(avalible_mac);
+ ui->txtb_dispaly->clear();
+ // 检测到开机信号后清理缓存,避免无限增长
+ boot_detect_buffer.clear();
+ qDebug() << tr("检测到开机信号(yaffs filesystem init start),清理缓存");
+
+ }
+
+ // 在缓存区中检测MAC地址信息,处理分包情况
+ if (working_state_1 && !waiting_cmd1) {
+ // 使用正则表达式在缓存区中查找完整的MAC地址
+ QRegExp macRegex("BTMAC=([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})");
+ int macPos = macRegex.indexIn(boot_detect_buffer);
+ if (macPos >= 0) {
+ QString foundMac = macRegex.cap(1); // 提取MAC地址部分 (28:11:06:XX:XX:XX)
+ qDebug() << tr("🔍 在开机缓冲区中发现完整MAC地址:") << foundMac;
+
+ // 转换为无冒号格式
+ QString macWithoutColon = foundMac.replace(":", "").toUpper();
+ qDebug() << tr("转换后的MAC地址:") << macWithoutColon;
+
+ // 检查MAC地址是否已被使用
+ bool mac_used = settings::getInstance().getMacUsed(macWithoutColon);
+ qDebug() << tr("MAC地址是否已被使用:") << mac_used;
+
+ if (mac_used) {
+ ui_display1(tr("手表地址") + macWithoutColon + tr("已占用\r\n"), LOG_DIRECT_OUT);
+ ui_show_result1(tr("Mac地址已占用"), false);
+ } else {
+ ui_display1(tr("手表当前地址") + macWithoutColon + tr(" 可用!\r\n"), LOG_DIRECT_IN);
+ qDebug() << tr("✅ 手表当前MAC地址可用:") << macWithoutColon;
+ }
+ }
+ }
+ // 在缓存区中检测命令时机信号,处理分包情况
+ if (waiting_cmd1 && boot_detect_buffer.indexOf(TIME_FOR_CMD)>=0)
+ {
+ uart_send_data1(ATCMD_ADD_VOTE);
+ // 检测到命令时机后也清理缓存
+ boot_detect_buffer.clear();
+ qDebug() << tr("检测到命令时机信号,清理缓存");
+ }
+
+ // 检测启动完成信号,需要同时检测到两个信号
+ if (waiting_cmd1 && !startup_complete_detected &&
+ boot_detect_buffer.indexOf(STARTUP_POST_INIT) >= 0 &&
+ boot_detect_buffer.indexOf(STARTUP_POST_INIT_TASK) >= 0)
+ {
+ startup_complete_detected = true; // 设置标志,防止重复触发
+ qDebug() << tr("✅ 检测到启动完成信号,系统已完全启动");
+ ui_display1(tr("系统启动完成,可以执行GETIDS\r\n"), LOG_DIRECT_IN);
+
+ // 清理缓存
+ boot_detect_buffer.clear();
+ qDebug() << tr("检测到启动完成信号,清理缓存");
+
+ // 如果当前正在等待GETIDS执行,且没有AT命令在执行,则触发GETIDS
+ if ((cmd_index_1 == 3 || cmd_index_1 == 4) && !uart_rx_flag1) {
+ qDebug() << tr("🚀 启动完成且正在等待GETIDS,立即触发GETIDS执行");
+ qDebug() << tr("当前cmd_index_1:") << cmd_index_1;
+
+ if (cmd_index_1 == 3) {
+ cmd_index_1++; // 从3递增到4
+ qDebug() << tr("cmd_index_1从3递增到4");
+ }
+ // 如果cmd_index_1已经是4,保持不变,重新执行case 4
+
+ // 清空之前的响应缓冲区,准备接收GETIDS响应
+ uart_rx_buff_array1.clear();
+ qDebug() << tr("清空响应缓冲区,准备执行GETIDS");
+
+ // 重新执行switch逻辑,现在startup_complete_detected = true
+ switch(cmd_index_1) {
+ case 4:
+ qDebug() << tr("✅ 系统已完全启动,发送GETIDS指令");
+ this->uart_send_data1(ATCMD_GET_CPUID);
+ break;
+ default:
+ qDebug() << tr("启动完成回调中的cmd_index_1异常:") << cmd_index_1;
+ break;
+ }
+ }
+ }
+
+ if (uart_rx_flag1)
+ {//指令下达完毕,开始接收数据
+ uart_rx_buff_array1.append(data);
+ qDebug() << tr("📥 AT命令响应数据累积中,当前长度:") << uart_rx_buff_array1.length();
+ qDebug() << tr("📥 当前累积内容:") << uart_rx_buff_array1;
+
+ // 检查各种可能的结束标志
+ bool hasOK = uart_rx_buff_array1.indexOf("OK~") >= 0;
+ bool hasPowerOff = uart_rx_buff_array1.indexOf("power off device!") >= 0;
+ bool hasDSPPowerDown = uart_rx_buff_array1.indexOf("DSP0 power down") >= 0;
+
+ // 特殊处理:对于GETBTMAC命令,如果检测到完整的MAC地址响应,认为命令完成
+ bool isGetMacComplete = false;
+ qDebug() << tr("🔧 当前命令G_cmd:") << G_cmd;
+ qDebug() << tr("🔧 是否包含GETBTMAC:") << G_cmd.contains("GETBTMAC");
+
+ if (G_cmd.contains("GETBTMAC")) {
+ qDebug() << tr("🔧 开始GETBTMAC特殊检测");
+ // 检查是否包含完整的MAC地址格式和CyweeChipInfo
+ bool hasLocalAddr = uart_rx_buff_array1.indexOf("get nv local_addr") >= 0;
+ bool hasBTMAC = uart_rx_buff_array1.indexOf("BTMAC=") >= 0;
+ bool hasCyweeChipInfo = uart_rx_buff_array1.indexOf("CyweeChipInfo=") >= 0;
+
+ qDebug() << tr("🔧 检测结果 - hasLocalAddr:") << hasLocalAddr << tr("hasBTMAC:") << hasBTMAC << tr("hasCyweeChipInfo:") << hasCyweeChipInfo;
+
+ if (hasLocalAddr && hasBTMAC && hasCyweeChipInfo) {
+ qDebug() << tr("🔧 基本条件满足,检查MAC地址格式");
+ // 进一步检查是否包含完整的MAC地址格式
+ QRegExp completeMacRegex("BTMAC=([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})");
+ int macPos = completeMacRegex.indexIn(uart_rx_buff_array1);
+ qDebug() << tr("🔧 MAC地址正则匹配结果:") << macPos;
+
+ if (macPos >= 0) {
+ QString foundMac = completeMacRegex.cap(1);
+ qDebug() << tr("🔧 找到完整MAC地址:") << foundMac;
+ isGetMacComplete = true;
+ qDebug() << tr("✅ GETBTMAC命令响应完整,包含完整MAC地址和CyweeChipInfo");
+ }
+ }
+ } else {
+ qDebug() << tr("🔧 当前命令不是GETBTMAC,跳过GETBTMAC特殊检测");
+ }
+
+
+ qDebug() << tr("🔍 结束标志检查 - OK~:") << hasOK << tr("power off:") << hasPowerOff << tr("DSP0 power down:") << hasDSPPowerDown << tr("GETMAC完整:") << isGetMacComplete;
+
+ if (hasOK || hasPowerOff || hasDSPPowerDown || isGetMacComplete)
+ {
+ qDebug() << tr("✅ 检测到结束标志,开始处理AT命令结果");
+
+ // 停止超时定时器
+ if (spp_timer_handle1->isActive()) {
+ spp_timer_handle1->stop();
+ qDebug() << tr("🛑 停止AT命令超时定时器");
+ }
+
+ uart_rx_flag1 = false;
+ uart_process1();//开始处理当前指令结果
+if (cmd_index_1 <0)
+ {
+ if (spp_timer_handle1->isActive())
+ spp_timer_handle1->stop();
+
+ if (uart_rx_buff_array1.indexOf("power off device") >= 0 )
+ {
+ ui_display1(tr("关机成功\r\n"),LOG_DIRECT_IN);
+}
+ return;
+ }
+ cmd_index_1 ++; //开始执行下一指令
+ qDebug()<<"next cmdindex "<<cmd_index_1;
+switch(cmd_index_1){
+ case 0:
+ {
+
+ }
+ case 1:
+ {
+ qDebug() << tr("=== 执行case 1: 查询手表MAC地址 ===");
+ this->uart_send_data1(ATCMD_GET_MAC);
+ }
+ break;
+ case 2:
+ {
+ QString set_mac_cmd=QString(ATCMD_SET_MAC).arg(ui->ledit_spp_addr_1->text());
+ this->uart_send_data1(set_mac_cmd);
+ }
+ break;
+ case 3:
+ {
+ this->uart_send_data1(ATCMD_GET_MAC);
+ }
+ break;
+ case 4:
+ {
+ // 只有在检测到启动完成信号后才发送GETIDS
+ if (startup_complete_detected) {
+ qDebug() << tr("✅ 系统已完全启动,发送GETIDS指令");
+ this->uart_send_data1(ATCMD_GET_CPUID);
+ } else {
+ qDebug() << tr("⏳ 等待系统完全启动信号,暂不发送GETIDS");
+ ui_display1(tr("等待系统完全启动信号...\r\n"), LOG_DIRECT_OUT);
+ // 保持在case 4,等待启动完成信号
+ cmd_index_1 = 4;
+ return;
+ }
+ }
+ break;
+ case 5:
+ {
+ this->uart_send_data1(ATCMD_POWEROFF);
+ }
+ break;
+ default:
+ {
+ cmd_index_1=-1;
+ if (spp_timer_handle1->isActive())
+ spp_timer_handle1->stop();
+ }
+ break;
+ }
+ }
+ else{
+
+ }
+ }
+
+
+
+// m_timer->stop();
+
+
+
+// {
+// ui_display1(data,false);
+// }
+// m_console->putData(data);
+}
+void MainWindow::readData2()
+{
+ const QByteArray data = serialport2->readAll();
+ qDebug()<<data;
+// m_console->putData(data);
+}
+void MainWindow::readData3()
+{
+ const QByteArray data = serialport3->readAll();
+ qDebug()<<data;
+// m_console->putData(data);
+}
+void MainWindow::readData4()
+{
+ const QByteArray data = serialport4->readAll();
+ qDebug()<<data;
+// m_console->putData(data);
+}
+// 结束线程
+MainWindow::~MainWindow()
+{
+ if (spp_timer_handle1 != nullptr) {
+ spp_timer_handle1->stop();
+ spp_timer_handle1 = nullptr;
+ }
+// if (spp_connected_handle != nullptr) {
+// spp_connected_handle->stop();
+// spp_connected_handle = nullptr;
+// }
+ ui_setting_save();
+ result_thread1->stop();
+ result_thread1->wait();
+ result_thread2->stop();
+ result_thread2->wait();
+ result_thread3->stop();
+ result_thread3->wait();
+ result_thread4->stop();
+ result_thread4->wait();
+
+
+ delete result_thread1;
+ delete result_thread2;
+ delete result_thread3;
+ delete result_thread4;
+ delete ui;
+}
+void MainWindow::poweroff_watch1()
+{
+// cmd_index_1 = 4; //直接执行关机
+ this->uart_send_data1(ATCMD_POWEROFF);
+}
+
+void MainWindow::ui_display1(QString str,bool inOrOut)
+{
+
+ ui->txtb_dispaly->moveCursor(QTextCursor::End);
+ if(inOrOut){
+ ui->txtb_dispaly->setTextColor(QColor(127, 255, 0));
+ }else{
+ ui->txtb_dispaly->setTextColor(Qt::red);
+ }
+ ui->txtb_dispaly->insertPlainText(str);
+ ui->txtb_dispaly->moveCursor(QTextCursor::End);
+}
+void MainWindow::ui_display2(QString str,bool inOrOut)
+{
+// QTime Time= QTime::currentTime();//获取系统当前的时间
+// QString str_time = Time.toString("[hh:mm:ss ");//格式化时间
+ ui->txtb_dispaly_2->moveCursor(QTextCursor::End);
+ if(inOrOut){
+ ui->txtb_dispaly_2->setTextColor(QColor(127, 255, 0));
+ }else{
+ ui->txtb_dispaly_2->setTextColor(Qt::red);
+ }
+// if(inOrOut){
+// str_time.append("IN] : ");
+// }else{
+// str_time.append("OUT] : ");
+// }
+// str.prepend(str_time);
+// str+="\r\n";
+ ui->txtb_dispaly_2->insertPlainText(str);
+ ui->txtb_dispaly_2->moveCursor(QTextCursor::End);
+}
+void MainWindow::ui_display3(QString str,bool inOrOut)
+{
+// QTime Time= QTime::currentTime();//获取系统当前的时间
+// QString str_time = Time.toString("[hh:mm:ss ");//格式化时间
+ ui->txtb_dispaly_3->moveCursor(QTextCursor::End);
+ if(inOrOut){
+ ui->txtb_dispaly_3->setTextColor(QColor(127, 255, 0));
+ }else{
+ ui->txtb_dispaly_3->setTextColor(Qt::red);
+ }
+// if(inOrOut){
+// str_time.append("IN] : ");
+// }else{
+// str_time.append("OUT] : ");
+// }
+// str.prepend(str_time);
+// str+="\r\n";
+ ui->txtb_dispaly_3->insertPlainText(str);
+ ui->txtb_dispaly_3->moveCursor(QTextCursor::End);
+}
+void MainWindow::ui_display4(QString str,bool inOrOut)
+{
+// QTime Time= QTime::currentTime();//获取系统当前的时间
+// QString str_time = Time.toString("[hh:mm:ss ");//格式化时间
+ ui->txtb_dispaly_4->moveCursor(QTextCursor::End);
+ if(inOrOut){
+ ui->txtb_dispaly_4->setTextColor(QColor(127, 255, 0));
+ }else{
+ ui->txtb_dispaly_4->setTextColor(Qt::red);
+ }
+// if(inOrOut){
+// str_time.append("IN] : ");
+// }else{
+// str_time.append("OUT] : ");
+// }
+// str.prepend(str_time);
+// str+="\r\n";
+ ui->txtb_dispaly_4->insertPlainText(str);
+ ui->txtb_dispaly_4->moveCursor(QTextCursor::End);
+}
+
+void MainWindow::ui_save_windows()
+{
+ QString fname = QFileDialog::getExistingDirectory(this, tr("请选择文件"));
+ QFile file(fname+"/save.txt");
+ if (!file.open(QFile::WriteOnly | QFile::Text)) //检测文件是否打开
+ {
+ QMessageBox::information(this, "Error Message", "Please Select a Text File!");
+ return;
+ }
+
+ QTextStream out(&file); //分行写入文件
+ out << ui->txtb_dispaly->toPlainText(); //这里的File_edit就是之前声明的Textedit控件的名字
+}
+// 存储config配置文件
+void MainWindow::ui_setting_save()
+{
+ QSettings *settings = new QSettings("Setting.ini", QSettings::IniFormat);
+
+ // 写入第一组数据
+ settings->beginGroup("Uart_setting");
+ settings->setValue("uart_com", ui->cbox_uart_com_select_1->currentText());
+ settings->setValue("uart_baud", ui->cbox_uart_baud_select->currentIndex());
+// settings->setValue("spp_addr", ui->ledit_spp_addr->text());
+ settings->sync();
+ settings->endGroup();
+ delete settings;
+ settings = nullptr;
+}
+// 读取config配置
+void MainWindow::ui_setting_read()
+{
+ uart_com_select();
+ QSettings *msettings = new QSettings("Setting.ini", QSettings::IniFormat);
+ ui->cbox_uart_com_select_1->ChangeItem(msettings->value("Uart_setting/uart_com").toString());
+ ui->cbox_uart_baud_select->setCurrentIndex(msettings->value("Uart_setting/uart_baud").toInt());
+
+ settings::getInstance().load_settings();
+ ui->textBrowser_result->setText(settings::getInstance().getmacStatusFull());
+
+}
+
+
+/* --------------------------------uart操作--------------------------- */
+void MainWindow::uart_process1()
+{
+ qDebug()<<"uart_process1 "<< cmd_index_1;
+ //处理指令结果
+ switch(cmd_index_1){
+ case 0:
+ ui_display1(tr("阻止休眠\r\n"),LOG_DIRECT_IN);
+ qDebug()<<tr("阻止休眠");
+
+ // 投票指令完成后,如果还没有发送SETUART指令,则立即发送
+ // 已注释:去掉发送AT_SETUART=1
+ /*
+ if (!setuart_sent) {
+ qDebug() << tr("投票指令完成,立即发送SETUART指令");
+ ui_display1(tr("发送SETUART指令\r\n"), LOG_DIRECT_OUT);
+ setuart_sent = true; // 设置标志,防止重复发送
+ this->uart_send_data1(ATCMD_SETUART);
+ return; // 等待SETUART指令完成,不继续执行下一个指令
+ }
+ */
+ break;
+ case 1:
+ {
+ //检查当前的号是否已经是写过的号,放置重复写号造成的浪费。
+ qDebug() << tr("=== 执行case 1: 查询手表MAC地址 ===");
+ qDebug() << tr("uart_rx_buff_array1长度:") << uart_rx_buff_array1.length();
+ qDebug() << tr("uart_rx_buff_array1内容:") << uart_rx_buff_array1;
+
+
+ // 使用正则表达式查找MAC地址格式: BTMAC=28:11:06:XX:XX:XX,支持多包检测
+ qDebug() << tr("🔍 开始在AT响应中查找MAC地址");
+ qDebug() << tr("当前缓存内容:") << uart_rx_buff_array1;
+ qDebug() << tr("缓存长度:") << uart_rx_buff_array1.length();
+
+ QRegExp macRegex("BTMAC=([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})");
+ int ret = macRegex.indexIn(uart_rx_buff_array1);
+ qDebug() << tr("正则表达式查找结果:") << ret;
+
+ // 如果正则表达式没找到,尝试简单的BTMAC=查找来调试
+ int simple_ret = uart_rx_buff_array1.indexOf("BTMAC=");
+ qDebug() << tr("简单BTMAC=查找结果:") << simple_ret;
+
+ if (simple_ret >= 0) {
+ // 显示BTMAC=后面的内容,看看是否完整
+ QString after_btmac = uart_rx_buff_array1.mid(simple_ret);
+ qDebug() << tr("BTMAC=后面的内容:") << after_btmac;
+
+ // 备用方法:如果正则表达式失败,尝试手动提取MAC地址
+ if (ret < 0) {
+ qDebug() << tr("🔧 正则表达式失败,尝试备用提取方法");
+
+ // 查找BTMAC=后面是否有足够的字符来组成MAC地址
+ QString remaining = uart_rx_buff_array1.mid(simple_ret + 6); // 跳过"BTMAC="
+ qDebug() << tr("BTMAC=后的剩余内容:") << remaining;
+
+ // 尝试提取MAC地址,即使不完整也显示当前状态
+ QRegExp partialMacRegex("([0-9A-Fa-f:]+)");
+ if (partialMacRegex.indexIn(remaining) >= 0) {
+ QString partialMac = partialMacRegex.cap(1);
+ qDebug() << tr("部分MAC地址:") << partialMac;
+
+ // 检查是否是完整的MAC地址(应该有5个冒号)
+ int colonCount = partialMac.count(':');
+ qDebug() << tr("冒号数量:") << colonCount << tr("(完整MAC地址应该有5个冒号)");
+
+ if (colonCount == 5) {
+ qDebug() << tr("✅ 检测到完整MAC地址,使用备用方法处理");
+ QString unit = partialMac.replace(":", "").toUpper();
+ qDebug() << tr("备用方法提取的MAC地址:") << unit;
+
+ bool mac_used = settings::getInstance().getMacUsed(unit.toUpper());
+ qDebug() << tr("MAC地址是否已被使用:") << mac_used;
+
+ if (mac_used) {
+ ui_display1(tr("手表地址")+unit+tr("已占用\r\n"),LOG_DIRECT_OUT);
+ ui_show_result1(tr("Mac地址已占用"),false);
+ cmd_index_1 = -1;
+ } else {
+ ui_display1(tr("手表当前地址")+unit+tr(" 可用!\r\n"),LOG_DIRECT_IN);
+ }
+
+ // 跳过后面的正常处理
+ break;
+ } else {
+ qDebug() << tr("⚠️ MAC地址不完整,等待更多数据");
+ }
+ }
+ }
+ }
+
+ if (ret >= 0)
+ {
+ QString mac_with_colon = macRegex.cap(1); // 提取MAC地址部分 (28:11:06:4D:29:EF)
+ qDebug() << tr("找到BTMAC=,位置:") << ret;
+ qDebug() << tr("提取的MAC地址(带冒号):") << mac_with_colon;
+
+ QString unit = mac_with_colon.replace(":", "").toUpper(); // "28110604D29EF"
+ qDebug() << tr("处理后的MAC地址(无冒号):") << unit;
+
+ bool mac_used = settings::getInstance().getMacUsed(unit.toUpper());
+ qDebug() << tr("MAC地址是否已被使用:") << mac_used;
+
+ if (mac_used)
+ {
+ ui_display1(tr("手表地址")+unit+tr("已占用\r\n"),LOG_DIRECT_OUT);
+ ui_show_result1(tr("Mac地址已占用"),false);
+ cmd_index_1 = -1;
+ }else{
+ ui_display1(tr("手表当前地址")+unit+tr(" 可用!\r\n"),LOG_DIRECT_IN);
+ }
+
+ }else{
+ qDebug() << tr("在uart_rx_buff_array1中未找到BTMAC=");
+ qDebug() << tr("完整缓存内容(十六进制):") << uart_rx_buff_array1.toHex();
+ ui_display1(tr("查询手表Mac失败!\r\n"),LOG_DIRECT_OUT);
+ cmd_index_1 = -1;
+ ui_show_result1(tr("查询手表Mac失败"),false);
+ }
+
+ }
+ break;
+ case 2:
+ {
+ QString new_mac = ui->ledit_spp_addr_1->text();
+ ui_display1(tr("执行设置地址\r\n"),LOG_DIRECT_OUT);
+ qDebug() << tr("=== 执行case 2: 设置MAC地址完成 ===");
+ qDebug() << tr("设置的MAC地址:") << new_mac;
+ ui_display1(tr("MAC地址设置完成,等待设备处理...\r\n"), LOG_DIRECT_IN);
+ }
+ break;
+ case 3:
+ {
+ // 验证设置的MAC地址是否成功
+ QString unit = ui->ledit_spp_addr_1->text();
+ qDebug() << tr("=== 执行case 3: 验证设置的MAC地址 ===");
+ qDebug() << tr("期望的MAC地址:") << unit;
+ qDebug() << tr("响应数据长度:") << uart_rx_buff_array1.length();
+
+ if (uart_rx_buff_array1.length() < 50) {
+ qDebug() << tr("⚠️ 响应数据较短,可能是超时或设备重启中");
+ }
+
+
+ // 使用正则表达式查找MAC地址格式: BTMAC=28:11:06:XX:XX:XX,支持多包检测
+ QRegExp macRegex("BTMAC=([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2})");
+ int ret = macRegex.indexIn(uart_rx_buff_array1);
+ if (ret >= 0)
+ {
+ // 提取MAC地址部分
+ QString mac_with_colon = macRegex.cap(1); // "28:11:06:4D:29:EF"
+ QString unit_watch = mac_with_colon.replace(":", "").toUpper(); // "28110604D29EF"
+
+ qDebug() << tr("手表返回的MAC地址:") << unit_watch;
+ qDebug() << tr("期望的MAC地址:") << unit;
+
+ if(unit_watch.toUpper() == unit.toUpper())
+ {
+ ui_display1(tr("设置Mac")+unit_watch+tr("成功\r\n"),LOG_DIRECT_IN);
+ }else{
+ ui_display1(tr("设置Mac")+unit_watch+tr("失败\r\n"),LOG_DIRECT_OUT);
+ cmd_index_1 = -2;
+ ui_show_result1(tr("Mac地址设置失败"),false);
+ }
+
+ }else{
+ ui_display1(tr("设置Mac")+unit+tr("失败\r\n"),LOG_DIRECT_OUT);
+ cmd_index_1 = -3;
+ ui_show_result1(tr("查询手表Mac失败"),false);
+ }
+
+ }
+ break;
+ case 4:
+ {
+ qDebug() << tr("=== 执行case 4: 获取CPU ID ===");
+ qDebug() << tr("响应内容:") << uart_rx_buff_array1;
+ qDebug() << tr("响应长度:") << uart_rx_buff_array1.length();
+
+ // 使用分包检测方式查找CPU ID信息
+ int ret = uart_rx_buff_array1.indexOf("[soc id:]");
+ qDebug() << tr("[soc id:]查找结果:") << ret;
+
+ if (ret >= 0)
+ {
+ // 查找[soc id:]后面的内容,直到遇到OK~或其他结束标志
+ QString soc_section = uart_rx_buff_array1.mid(ret);
+ qDebug() << tr("SOC部分内容:") << soc_section;
+
+ // 检查是否包含完整的数据结束标志
+ bool hasCompleteData = soc_section.contains("OK~") || soc_section.contains("\r\n\r\n");
+ qDebug() << tr("是否包含完整数据标志:") << hasCompleteData;
+
+ // 提取所有的十六进制数据(0x开头的),支持分包和多行格式
+ QRegExp hexRegex("0x[0-9A-Fa-f]{4}");
+ QStringList hexValues;
+ int pos = 0;
+
+ while ((pos = hexRegex.indexIn(soc_section, pos)) != -1) {
+ hexValues << hexRegex.cap(0);
+ pos += hexRegex.matchedLength();
+ qDebug() << tr("找到十六进制值:") << hexRegex.cap(0) << tr("位置:") << pos;
+ }
+
+ qDebug() << tr("提取的十六进制值:") << hexValues;
+ qDebug() << tr("十六进制值数量:") << hexValues.size();
+
+ // 检查数据完整性:需要至少10个十六进制值且有结束标志
+ if (hexValues.size() >= 10 && hasCompleteData) {
+ // 将所有十六进制值连接成CPU ID(去掉0x前缀)
+ QString cpu_id = "";
+ for (const QString &hex : hexValues) {
+ cpu_id += hex.mid(2); // 去掉"0x"前缀
+ }
+
+ qDebug() << tr("组合的CPU ID:") << cpu_id;
+ ui_display1("cpuid: " + cpu_id + "\r\n", LOG_DIRECT_IN);
+
+ int db_ret = settings::getInstance().set_mac_used(ui->ledit_spp_addr_1->text(), cpu_id, true);
+ qDebug() << "set mac used " << ui->ledit_spp_addr_1->text() << " " << cpu_id << " ret " << db_ret;
+
+ if (db_ret == 1)
+ {
+ ui->textBrowser_result->setText(settings::getInstance().getmacStatusFull());
+ ui_display1(tr("设置mac成功\r\n"), LOG_DIRECT_IN);
+ } else {
+ ui_show_result1(tr("获取cpuid失败\r\n"), false);
+ }
+ } else {
+ qDebug() << tr("CPU ID数据不完整 - 十六进制值:") << hexValues.size() << tr("完整标志:") << hasCompleteData;
+
+ if (!hasCompleteData) {
+ qDebug() << tr("等待完整的AT^GETIDS响应数据");
+ ui_display1(tr("等待CPU ID完整数据...\r\n"), LOG_DIRECT_OUT);
+ return; // 等待更多数据
+ } else if (hexValues.size() < 10) {
+ qDebug() << tr("十六进制值数量不足,期望>=10,实际:") << hexValues.size();
+ ui_display1(tr("CPU ID格式不正确\r\n"), LOG_DIRECT_OUT);
+ cmd_index_1 = -4;
+ ui_show_result1(tr("获取CPU ID失败"), false);
+ }
+ }
+ } else {
+ qDebug() << tr("未找到[soc id:]标志,可能数据分包传输中");
+ ui_display1(tr("等待CPU ID数据...\r\n"), LOG_DIRECT_OUT);
+
+ // 不使用备用CPU ID,直接失败
+ cmd_index_1 = -4;
+ ui_show_result1(tr("获取CPU ID失败"), false);
+ }
+ }
+ break;
+ case 5:
+ {
+ int ret = uart_rx_buff_array1.indexOf("power off device");
+ if (ret >= 0 )
+ {
+ ui_display1(tr("关机成功\r\n"),LOG_DIRECT_IN);
+ }else{
+ ui_display1(tr("关机失败\r\n"),LOG_DIRECT_OUT);
+ }
+ ui_show_result1(tr("设置mac成功\r\n"),true);
+
+ }
+ break;
+ default:
+ {
+ cmd_index_1=-1;
+ }
+ break;
+ }
+}
+void MainWindow::uart_process2()
+{
+// if (ui->pbtn_open_uart->isChecked()) {
+ QString str_com = ui->cbox_uart_com_select_1->currentText();
+ QString str_uart_baud = ui->cbox_uart_baud_select->currentText();
+// uart_open(str_com,str_uart_baud);
+// } else {
+// uart_close();
+// }
+}
+void MainWindow::uart_process3()
+{
+// if (ui->pbtn_open_uart->isChecked()) {
+ QString str_com = ui->cbox_uart_com_select_1->currentText();
+ QString str_uart_baud = ui->cbox_uart_baud_select->currentText();
+// uart_open(str_com,str_uart_baud);
+// } else {
+// uart_close();
+// }
+}
+void MainWindow::uart_process4()
+{
+// if (ui->pbtn_open_uart->isChecked()) {
+ QString str_com = ui->cbox_uart_com_select_1->currentText();
+ QString str_uart_baud = ui->cbox_uart_baud_select->currentText();
+// uart_open(str_com,str_uart_baud);
+// } else {
+// uart_close();
+// }
+}
+//void MainWindow::uart_open(QString com,QString com_baud)
+//{
+
+//}
+//void MainWindow::uart_close()
+//{
+
+//}
+void MainWindow::uart_send_data1(QString cmd)
+{
+ qint64 ret =0;
+
+ // 发送AT指令之前清空缓存区,确保响应数据的准确性
+ uart_rx_buff_array1.clear();
+ qDebug() << tr("🧹 发送AT指令前清空缓存区");
+
+ qDebug()<<"uart_send_data1 "<<cmd;
+ ret=serialport1->write(cmd.toUtf8());
+ m_bytesToWrite1 = ret;
+ qDebug()<<"uart_send_data1 "<<cmd << " ret "<<m_bytesToWrite1;
+
+ G_cmd=cmd;
+ if (spp_timer_handle1->isActive())
+ spp_timer_handle1->stop();
+
+ // 对于特定命令使用更长的超时时间
+ if (cmd.contains("GETIDS")) {
+ spp_timer_handle1->start(5000); // 5秒超时
+ qDebug() << tr("GETIDS命令使用5秒超时");
+ } else if (cmd.contains("GETBTMAC")) {
+ spp_timer_handle1->start(3000); // GETBTMAC命令3秒超时
+ qDebug() << tr("GETBTMAC命令使用3秒超时");
+ } else {
+ spp_timer_handle1->start(1500); // 其他命令1.5秒超时
+ }
+// ui_display1(cmd,true);
+// 发送指令,在发送结束的handleBytesWritten1中,设置接收状态,
+// 接收函数 readData1 中确认指令是否执行完毕,然后执行下一个指令。
+}
+void MainWindow::uart_send_data2(QString cmd)
+{
+
+}
+void MainWindow::uart_send_data3(QString cmd)
+{
+
+}
+void MainWindow::uart_send_data4(QString cmd)
+{
+
+}
+// uart收到的数据进行回显到显示栏
+void MainWindow::uart_rx_dispaly1(int buf_len, u8Piont buf)
+{
+ uart_rx_flag1 = true;
+ if (uart_rx_Ignoring_display) {
+ QString str((char *)buf);
+ if(str.contains("ADDR")){
+// ui->ledit_dongle_mac->setText(str.mid(str.indexOf("=",0)+1,12));
+ }
+ return;
+ }
+ QString str;
+ QByteArray data((const char*)buf, buf_len);
+// if (ui->ckbox_Hex_Display->isChecked()) {
+// for (int i = 0; i < data.size(); i++) {
+// str += QString("%1 ").arg((quint8)data.at(i), 2, 16, QChar('0'));
+// }
+// str=str.toUpper();
+// } else {
+// for (int i = 0; i < data.size(); i++) {
+// str += QString(data.at(i));
+// }
+// }
+ ui_display1(str,true);
+ free(buf);
+}
+
+void MainWindow::uart_com_select()
+{
+ ui->cbox_uart_com_select_1->clear();
+ QStringList strlist = uart_get_enable_comm_or_port();
+ qSort(strlist.begin(), strlist.end(),[](const QString& s1, const QString& s2){
+ QString a1=s1;QString a2=s2;
+ return a1.replace("COM","").toInt() < a2.replace("COM","").toInt(); });
+ ui->cbox_uart_com_select_1->addItems(strlist);
+}
+void MainWindow::uart_com_switch(QString com)
+{
+ QString str_uart_baud = ui->cbox_uart_baud_select->currentText();
+
+}
+void MainWindow::uart_baud_switch(QString baud)
+{
+ QString str_com = ui->cbox_uart_com_select_1->currentText();
+
+}
+// nIndex为索引号 bValue选择返回值为key还是value,默认为value
+QString MainWindow::uart_get_comm_or_port(int nIndex, bool bValue)
+{
+ QString strCommRet = QObject::tr("");
+ HKEY hKey;
+ if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0) {
+ QMessageBox::warning(this, tr("Register"), tr("can't open register"),QMessageBox::Ok);
+ return QObject::tr(""); // 无法打开注册表
+ }
+ QString strKeyMsg; // 键名
+ QString strValueMsg; // 键值
+ TCHAR portName[256]; // 键名数组
+ TCHAR commName[256]; // 键值数组
+ ulong nKeySize = sizeof(portName);
+ ulong nValueSize = sizeof(commName);
+ ulong nType;
+ memset(commName,0,sizeof(commName));
+ memset(portName,0,sizeof(portName));
+ if (::RegEnumValue(hKey, nIndex, portName, &nKeySize, 0, &nType, (BYTE *)commName, &nValueSize) == 0) { // 列举键名
+ // 读取键名
+ for (uint i = 0; i < nKeySize; i++) {
+ if (portName[i] != 0x00)
+ strKeyMsg.append(portName[i]);
+ }
+ // 读取键值
+ for (uint j = 0; j < nValueSize; j++) {
+ if (commName[j] != 0x00)
+ strValueMsg.append(commName[j]);
+ }
+ if (bValue)
+ strCommRet = strValueMsg;
+ else
+ strCommRet = strKeyMsg;
+ } else {
+ ::RegCloseKey(hKey); // 关闭注册表
+ return QObject::tr(""); // 无可用串口
+ }
+ return strCommRet;
+}
+void MainWindow::openLogfolder()
+{
+ QString path = QCoreApplication::applicationDirPath();
+ QDesktopServices::openUrl( QUrl::fromLocalFile( path ) );
+}
+
+QStringList MainWindow::uart_get_enable_comm_or_port()
+{
+ QStringList CommPortList;
+ QString strCommPath = QObject::tr("HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM");
+ QSettings *settings = new QSettings(strCommPath, QSettings::NativeFormat);
+ QStringList keyList = settings->allKeys();
+ if (!keyList.isEmpty()) {
+ for (int i = 0; i < keyList.count(); i++)
+ CommPortList.append(uart_get_comm_or_port(i, true));
+ }
+ return CommPortList;
+}
+
+/* ------------------------------------------------------------------- */
+void MainWindow::spp_connected_callback()
+{
+ ui_display1("com send cmd failed! ",false);
+}
+void MainWindow::spp_timer_callback2()
+{
+
+}
+void MainWindow::spp_timer_callback3()
+{
+
+}
+void MainWindow::spp_timer_callback4()
+{
+
+}
+
+void MainWindow::spp_timer_callback1()
+{
+ uart_rx_flag1 = false;
+ qDebug() << tr("AT命令超时:") << G_cmd;
+
+ if(G_cmd==ATCMD_ADD_VOTE)
+ {
+ this->uart_send_data1(ATCMD_ADD_VOTE);
+ }
+ else if(G_cmd.contains("GETIDS"))
+ {
+ // GETIDS命令超时,跳过CPU ID获取,继续执行关机
+ ui_display1(tr("获取CPU ID超时,跳过此步骤\r\n"), LOG_DIRECT_OUT);
+
+ // 直接跳到关机步骤
+ cmd_index_1 = 4; // 设置为4,这样下次会执行case 5(关机)
+ uart_rx_flag1 = false;
+ uart_process1(); // 直接处理,跳过CPU ID
+ }
+ else
+ {
+ ui_display1(tr("AT命令超时: %1\r\n").arg(G_cmd), LOG_DIRECT_OUT);
+ if (spp_timer_handle1->isActive())
+ spp_timer_handle1->stop();
+ }
+}
+
+void MainWindow::spp_connect_1()
+{
+ if (working_state_1 == false)
+ {
+ QString baud_rate = ui->cbox_uart_baud_select->currentText();
+ QString com_name = ui->cbox_uart_com_select_1->currentText();
+
+ qDebug() << tr("=== 开始连接串口1 ===");
+ qDebug() << tr("串口名称:") << com_name;
+ qDebug() << tr("波特率:") << baud_rate;
+
+ serialport1->setPortName(com_name);
+ serialport1->setBaudRate(baud_rate.toInt());
+ // 设置串口参数以提高兼容性
+ serialport1->setDataBits(QSerialPort::Data8);
+ serialport1->setParity(QSerialPort::NoParity);
+ serialport1->setStopBits(QSerialPort::OneStop);
+ serialport1->setFlowControl(QSerialPort::NoFlowControl);
+
+ // 设置更大的读缓冲区,提高数据处理能力
+ serialport1->setReadBufferSize(32768); // 32KB缓冲区
+
+ qDebug() << tr("串口配置 - 波特率:") << serialport1->baudRate();
+ qDebug() << tr("串口配置 - 数据位:") << serialport1->dataBits();
+ qDebug() << tr("串口配置 - 停止位:") << serialport1->stopBits();
+ qDebug() << tr("串口配置 - 校验位:") << serialport1->parity();
+ qDebug() << tr("串口配置 - 流控制:") << serialport1->flowControl();
+ qDebug() << tr("串口读缓冲区大小:") << serialport1->readBufferSize();
+
+ ui->txtb_dispaly->clear();
+ if (serialport1->isOpen())
+ {
+ qDebug() << tr("串口已经打开,重置命令索引");
+ this->cmd_index_1 = 0;
+// this->uart_send_data1(ATCMD_GET_MAC);
+
+ //
+ }else{
+ if (serialport1->open(QIODevice::ReadWrite)) {
+ // serialport1->setEnabled(true);
+ // serialport1->setLocalEchoEnabled(false);
+
+ qDebug() << tr("串口打开成功,连接信号槽");
+ connect(serialport1, &QSerialPort::readyRead, this, &MainWindow::readData1);
+ connect(serialport1, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten1);
+this->cmd_index_1 = 0;
+// this->uart_send_data1(ATCMD_GET_MAC);
+ // serialport1->close();
+ // disconnect(serialport1, &QSerialPort::readyRead, this, &MainWindow::readData1);
+
+ } else {
+ qDebug() << tr("串口打开失败:") << serialport1->errorString();
+ QMessageBox::critical(this, tr("Error"), serialport1->errorString());
+
+ ui_display1(tr("Open error\r\n"),false);
+ return;
+ }
+ }
+
+ // 开始工作
+ qDebug() << tr("=== 开始写地址工作模式 ===");
+ qDebug() << tr("系统信息 - Qt版本:") << QT_VERSION_STR;
+ qDebug() << tr("系统信息 - 编译器:") <<
+ #ifdef _MSC_VER
+ "MSVC " + QString::number(_MSC_VER);
+ #elif defined(__GNUC__)
+ "GCC " + QString::number(__GNUC__) + "." + QString::number(__GNUC_MINOR__);
+ #else
+ "Unknown";
+ #endif
+ working_state_1 = true;
+ write_fail_count1= 0;
+ write_success_count1 =0;
+
+
+ // 初始化开机检测缓存
+ boot_detect_buffer.clear();
+ waiting_cmd1 = false; // 重置等待命令状态
+ startup_complete_detected = false; // 重置启动完成检测标志
+ // setuart_sent = false; // 重置SETUART指令发送标志 (已注释:不再使用SETUART)
+ qDebug() << tr("初始化开机检测缓存");
+
+
+ ui->label_result_fail1->setText(tr("失败%1").arg(write_fail_count1));
+ ui->label_result_success1->setText(tr("成功%1").arg(write_success_count1));
+ ui->pbtn_spp_reconnect_1->setText(tr("停止写地址"));
+ui->label_runtime_status1->setText(tr("等待手表开机"));
+
+ qDebug() << tr("工作状态设置: working_state_1 = true");
+ qDebug() << tr("等待检测手表开机信号:") << BOOT_UP_MSG;
+ qDebug() << tr("等待检测命令时机信号:") << TIME_FOR_CMD;
+
+// QString avalible_mac = settings::getInstance().getAvalibleMac();
+// ui->ledit_spp_addr_1->setText(avalible_mac);
+// int ret =0;
+ // ret = settings::getInstance().set_mac_used(avalible_mac,"",true);
+
+ // qDebug()<< "set mac "<< avalible_mac<<" used , ret "<< ret;
+
+
+ qDebug()<<settings::getInstance().getmacStatusFull();
+
+
+
+ }else{
+ //停止工作
+ qDebug() << tr("=== 停止写地址工作模式 ===");
+ ui->pbtn_spp_reconnect_1->setText(tr("开始写地址"));
+ ui->label_runtime_status1->setText(tr("已停止写地址..."));
+ working_state_1 = false;
+
+ // 清空开机检测缓存
+ boot_detect_buffer.clear();
+ qDebug() << tr("清空开机检测缓存");
+
+ ui->txtb_dispaly->clear();
+ if(serialport1->isOpen())
+ serialport1->close();
+ disconnect(serialport1, &QSerialPort::readyRead, this, &MainWindow::readData1);
+ disconnect(serialport1, &QSerialPort::bytesWritten, this, &MainWindow::handleBytesWritten1);
+
+
+ }
+
+
+// this->serialport1->setBaudRate()
+// ui_display1("connect com1 ",false);
+}
+
+
+void MainWindow::handleBytesWritten1(qint64 bytes)
+{
+ qDebug()<<" handleBytesWritten1 m_bytesToWrite1 "<<m_bytesToWrite1<<" written " <<bytes;
+ m_bytesToWrite1 -= bytes;
+ if (m_bytesToWrite1 == 0)
+ {
+ uart_rx_flag1 = true;
+ uart_rx_buff_array1.clear();
+ }
+}
+void MainWindow::spp_connect_2()
+{
+ ui_display2("connect com1 ",false);
+
+}
+void MainWindow::spp_connect_3()
+{
+ ui_display3("connect com1 ",false);
+
+}
+void MainWindow::spp_connect_4()
+{
+ ui_display4("connect com1 ",false);
+
+}
+
+void MainWindow::spp_connect_all()
+{
+ uart_rx_Ignoring_display = true;
+// dongle_is_connected = false;
+// dongle_try_count = 0;
+// spp_try_count = 0;
+// uapi_uart_callback_register(uart_callback);
+// at_handler->at_send_cmd_board(DONGLE_MODE_ADDR,NULL);
+ ui_display1("spp connectting...",false);
+
+ // spp查询定时器周期为1500ms
+ spp_timer_handle1->start(1500);
+// ui->pbtn_spp_connect->setEnabled(false);
+}
+
+//void MainWindow::at_check_send_status(bool flag)
+//{
+// if(flag){
+// ui_display1("at cmd send success.\r\n",false);
+// }else{
+// QMessageBox::warning(this, tr("AT"), tr("AT send fail!\r\n"), QMessageBox::Ok);
+// ui_display1("at cmd send fail.\r\n",false);
+// }
+//}
+
+void MainWindow::ui_open_mac_config()
+{
+ DialogSettings *diag=new DialogSettings();
+
+ diag->show();
+
+}
+
+