优化蓝牙写号工具,适配650环境 HiBTMacWriteTool
authorpenglei <1624952103@qq.com>
Wed, 26 Nov 2025 12:25:46 +0000 (20:25 +0800)
committerpenglei <1624952103@qq.com>
Wed, 26 Nov 2025 12:25:46 +0000 (20:25 +0800)
HiBTMacWriteTool.pro
at_data.cpp
dialogsettings.cpp
main.cpp
mainwindow.cpp
mainwindow.h
result_thread.h
settings.cpp
settings.h

index 15bd036..02f9591 100644 (file)
@@ -1,55 +1,55 @@
-#-------------------------------------------------\r
-#\r
-# Project created by QtCreator 2024-03-04T16:59:50\r
-#\r
-#-------------------------------------------------\r
-\r
-QT       += core gui sql serialport\r
-\r
-greaterThan(QT_MAJOR_VERSION, 4): QT += widgets\r
-\r
-TARGET = HiBTMacWriteTool\r
-TEMPLATE = app\r
-\r
-\r
-SOURCES += main.cpp\\r
-        mainwindow.cpp \\r
-    mythread.cpp \\r
-    result_thread.cpp \\r
-    custom.cpp \\r
-    sqldbmanager.cpp \\r
-    settings.cpp \\r
-    dialogsettings.cpp\r
-\r
-HEADERS  += mainwindow.h \\r
-    mythread.h \\r
-    result_thread.h \\r
-    common.h \\r
-    custom.h \\r
-    sqldbmanager.h \\r
-    settings.h \\r
-    dialogsettings.h\r
-\r
-#HEADERS  +=  ui_mac_settings.h \\r
-#    ui_mainwindow.h\r
-\r
-FORMS    += mainwindow.ui \\r
-    mac_settings.ui\r
-\r
-DISTFILES += \\r
-    CMakeLists.txt \\r
-    readme.txt \\r
-    untitled_zh_CN.ts\r
-\r
-INCLUDEPATH += $$PWD/.\r
-DEPENDPATH += $$PWD/.\r
-\r
-\r
-LIBS += -L$$PWD/lib/\r
-\r
-\r
-LIBS += -lAdvapi32\r
-\r
-\r
-INCLUDEPATH += $$PWD/lib\r
-DEPENDPATH += $$PWD/lib\r
+#-------------------------------------------------
+#
+# Project created by QtCreator 2024-03-04T16:59:50
+#
+#-------------------------------------------------
+
+QT       += core gui sql serialport
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = HiBTMacWriteTool
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+        mainwindow.cpp \
+    mythread.cpp \
+    result_thread.cpp \
+    custom.cpp \
+    sqldbmanager.cpp \
+    settings.cpp \
+    dialogsettings.cpp
+
+HEADERS  += mainwindow.h \
+    mythread.h \
+    result_thread.h \
+    common.h \
+    custom.h \
+    sqldbmanager.h \
+    settings.h \
+    dialogsettings.h
+
+#HEADERS  +=  ui_mac_settings.h \
+#    ui_mainwindow.h
+
+FORMS    += mainwindow.ui \
+    mac_settings.ui
+
+DISTFILES += \
+    CMakeLists.txt \
+    readme.txt \
+    untitled_zh_CN.ts
+
+INCLUDEPATH += $$PWD/.
+DEPENDPATH += $$PWD/.
+
+
+LIBS += -L$$PWD/lib/
+
+
+LIBS += -lAdvapi32
+
+
+INCLUDEPATH += $$PWD/lib
+DEPENDPATH += $$PWD/lib
index 1d76e0d..04e48ab 100644 (file)
-#include <at_data.h>\r
-\r
-At_Process::At_Process(QObject *parent)\r
-{\r
-    Q_UNUSED(parent);\r
-    phy_type_list<<"01"<<"02";\r
-    ble_pattern_type_list<<"02 "<<"00 "<<"01 ";\r
-    br_pattern_type_list<<"03 "<<"04 "<<"09 ";\r
-    packet_type_list<<"04 01 "<<"0B 01 "<<"0F 01 "<<"04 00 "<<"0A 00 "<<"0E 00 "<<"08 00 "<<"0B 00 "<<"0F 00 ";\r
-    br_len_array<<27<<183<<339<<54<<367<<679<<83<<552<<1021;\r
-    board_cmd_map.insert(BT_MODE_BR_TX,"AT^BTTX=");\r
-    board_cmd_map.insert(BT_MODE_BR_RX,"AT^BTRX=");\r
-    board_cmd_map.insert(BT_MODE_BLE_TX,"AT^BLETX=");\r
-    board_cmd_map.insert(BT_MODE_BLE_RX,"AT^BLERX=");\r
-    board_cmd_map.insert(BT_MODE_BTDUTMODE, "AT^BTDUTMODE=");\r
-    board_cmd_map.insert(DONGLE_MODE_SPPCONN,"AT+SPPCONN=");\r
-    board_cmd_map.insert(DONGLE_MODE_AT,"AT");\r
-    board_cmd_map.insert(DONGLE_MODE_ADDR,"AT+ADDR");\r
-    board_cmd_map.insert(BT_MODE_BTLO,"AT^BTLO=");\r
-    board_cmd_map.insert(BT_MODE_BTPWR,"AT^BTPWR=");\r
-\r
-}\r
-At_Process::~At_Process(){}\r
-QString At_Process::at_get_packet_type(int packet_type_index)\r
-{\r
-    return packet_type_list.at(packet_type_index);\r
-}\r
-int At_Process::at_get_packet_len(int packet_type_index)\r
-{\r
-    return br_len_array.at(packet_type_index);\r
-}\r
-QString At_Process::at_get_br_pattern_type(int pattern_type_index)\r
-{\r
-    return br_pattern_type_list.at(pattern_type_index);\r
-}\r
-QString At_Process::at_get_ble_pattern_type(int pattern_type_index)\r
-{\r
-    return ble_pattern_type_list.at(pattern_type_index);\r
-}\r
-\r
-QString At_Process::at_get_ble_phy_type(int phy_type_index)\r
-{\r
-    return phy_type_list.at(phy_type_index);\r
-}\r
-QString At_Process::at_get_cmd_board(at_mode_board mode)\r
-{\r
-    return board_cmd_map[mode];\r
-}\r
-QString At_Process::at_get_switch_format(QString br_switch)\r
-{\r
-    QString str;\r
-    if(br_switch.contains("OFF")){\r
-        str="00";\r
-    }else if(br_switch.contains("ON")){\r
-        str="01 ";\r
-    }\r
-    return str;\r
-}\r
-QString At_Process::at_get_br_format(at_mode_board mode,QString br_switch,QString channel, int packet_type_index, QString payload_len, int pattern_type)\r
-{\r
-    QString str;\r
-    str += at_get_switch_format(br_switch);\r
-    if(br_switch.contains("ON")){\r
-        str += QString("%1 ").arg(channel.toUInt(), 2, 16, QLatin1Char('0'));\r
-        str += at_get_packet_type(packet_type_index);\r
-        QString str_temp = QString("%1").arg(payload_len.toUInt(), 4, 16, QLatin1Char('0'));\r
-        str.insert(9, str_temp.mid(0, 2)+" ");\r
-        str.insert(9, str_temp.mid(2, 2)+" ");\r
-        str += at_get_br_pattern_type(pattern_type);\r
-        if(mode==BT_MODE_BR_TX){\r
-            str.insert(3, "02 ");\r
-        }\r
-    }\r
-    return str;\r
-}\r
-\r
-QString At_Process::at_get_ble_format(at_mode_board mode,QString br_switch,QString channel,int pattern_type_index, QString payload_len, int phy_index)\r
-{\r
-    QString str=NULL;\r
-    str += at_get_switch_format(br_switch);\r
-    if(br_switch.contains("ON")){\r
-        str += QString("%1 ").arg(channel.toUInt(), 2, 16, QLatin1Char('0'));\r
-        if(mode==BT_MODE_BLE_TX){\r
-            str+= at_get_ble_pattern_type(pattern_type_index);\r
-            str+= QString("%1 ").arg(payload_len.toUInt(), 2, 16, QLatin1Char('0'));\r
-        }\r
-        str+=at_get_ble_phy_type(phy_index);\r
-    }\r
-    return str;\r
-}\r
-\r
-\r
-bool At_Process::at_send_cmd_board(at_mode_board mode,QString format)\r
-{\r
-//    char *buf=nullptr;\r
-    uint32_t buf_len=0;\r
-    bool ret=false;\r
-    QString str=at_get_cmd_board(mode);\r
-    str+=format;\r
-    str+="\r\n";\r
-    std::string bufstr = str.toStdString();\r
-    const char* buf = bufstr.c_str();\r
-    buf_len = strlen(buf);\r
-    if(uapi_uart_tx_data((void*)buf, buf_len)){\r
-        ret=true;\r
-    }\r
-    return ret;\r
-}\r
-\r
-bool At_Process::at_send_cmd_string(at_module_id module_id, at_cmd_id cmd_id,QString format)\r
-{\r
-    char *buf = nullptr;\r
-    uint32_t buf_len=0;\r
-    bool ret=false;\r
-    QByteArray arr = format.toLatin1();\r
-    buf = arr.data();\r
-    buf_len = arr.size();\r
-    if (uapi_at_send(module_id, cmd_id, (uint8_t *)buf, buf_len, at_callback) == SUCC) {\r
-        at_set_id(module_id, cmd_id);\r
-        ret=true;\r
-    }\r
-    return ret;\r
-}\r
-\r
-void At_Process::at_set_id(at_module_id at_module_id_temp, at_cmd_id at_cmd_id_temp)\r
-{\r
-    at_module_id_save = at_module_id_temp;\r
-    at_cmd_id_save = at_cmd_id_temp;\r
-}\r
-\r
-void At_Process::at_get_id(at_module_id *at_module_id, at_cmd_id *at_cmd_id)\r
-{\r
-    *at_module_id = at_module_id_save;\r
-    *at_cmd_id = at_cmd_id_save;\r
-}\r
+#include <at_data.h>
+
+At_Process::At_Process(QObject *parent)
+{
+    Q_UNUSED(parent);
+    phy_type_list<<"01"<<"02";
+    ble_pattern_type_list<<"02 "<<"00 "<<"01 ";
+    br_pattern_type_list<<"03 "<<"04 "<<"09 ";
+    packet_type_list<<"04 01 "<<"0B 01 "<<"0F 01 "<<"04 00 "<<"0A 00 "<<"0E 00 "<<"08 00 "<<"0B 00 "<<"0F 00 ";
+    br_len_array<<27<<183<<339<<54<<367<<679<<83<<552<<1021;
+    board_cmd_map.insert(BT_MODE_BR_TX,"AT^BTTX=");
+    board_cmd_map.insert(BT_MODE_BR_RX,"AT^BTRX=");
+    board_cmd_map.insert(BT_MODE_BLE_TX,"AT^BLETX=");
+    board_cmd_map.insert(BT_MODE_BLE_RX,"AT^BLERX=");
+    board_cmd_map.insert(BT_MODE_BTDUTMODE, "AT^BTDUTMODE=");
+    board_cmd_map.insert(DONGLE_MODE_SPPCONN,"AT+SPPCONN=");
+    board_cmd_map.insert(DONGLE_MODE_AT,"AT");
+    board_cmd_map.insert(DONGLE_MODE_ADDR,"AT+ADDR");
+    board_cmd_map.insert(BT_MODE_BTLO,"AT^BTLO=");
+    board_cmd_map.insert(BT_MODE_BTPWR,"AT^BTPWR=");
+
+}
+At_Process::~At_Process(){}
+QString At_Process::at_get_packet_type(int packet_type_index)
+{
+    return packet_type_list.at(packet_type_index);
+}
+int At_Process::at_get_packet_len(int packet_type_index)
+{
+    return br_len_array.at(packet_type_index);
+}
+QString At_Process::at_get_br_pattern_type(int pattern_type_index)
+{
+    return br_pattern_type_list.at(pattern_type_index);
+}
+QString At_Process::at_get_ble_pattern_type(int pattern_type_index)
+{
+    return ble_pattern_type_list.at(pattern_type_index);
+}
+
+QString At_Process::at_get_ble_phy_type(int phy_type_index)
+{
+    return phy_type_list.at(phy_type_index);
+}
+QString At_Process::at_get_cmd_board(at_mode_board mode)
+{
+    return board_cmd_map[mode];
+}
+QString At_Process::at_get_switch_format(QString br_switch)
+{
+    QString str;
+    if(br_switch.contains("OFF")){
+        str="00";
+    }else if(br_switch.contains("ON")){
+        str="01 ";
+    }
+    return str;
+}
+QString At_Process::at_get_br_format(at_mode_board mode,QString br_switch,QString channel, int packet_type_index, QString payload_len, int pattern_type)
+{
+    QString str;
+    str += at_get_switch_format(br_switch);
+    if(br_switch.contains("ON")){
+        str += QString("%1 ").arg(channel.toUInt(), 2, 16, QLatin1Char('0'));
+        str += at_get_packet_type(packet_type_index);
+        QString str_temp = QString("%1").arg(payload_len.toUInt(), 4, 16, QLatin1Char('0'));
+        str.insert(9, str_temp.mid(0, 2)+" ");
+        str.insert(9, str_temp.mid(2, 2)+" ");
+        str += at_get_br_pattern_type(pattern_type);
+        if(mode==BT_MODE_BR_TX){
+            str.insert(3, "02 ");
+        }
+    }
+    return str;
+}
+
+QString At_Process::at_get_ble_format(at_mode_board mode,QString br_switch,QString channel,int pattern_type_index, QString payload_len, int phy_index)
+{
+    QString str=NULL;
+    str += at_get_switch_format(br_switch);
+    if(br_switch.contains("ON")){
+        str += QString("%1 ").arg(channel.toUInt(), 2, 16, QLatin1Char('0'));
+        if(mode==BT_MODE_BLE_TX){
+            str+= at_get_ble_pattern_type(pattern_type_index);
+            str+= QString("%1 ").arg(payload_len.toUInt(), 2, 16, QLatin1Char('0'));
+        }
+        str+=at_get_ble_phy_type(phy_index);
+    }
+    return str;
+}
+
+
+bool At_Process::at_send_cmd_board(at_mode_board mode,QString format)
+{
+//    char *buf=nullptr;
+    uint32_t buf_len=0;
+    bool ret=false;
+    QString str=at_get_cmd_board(mode);
+    str+=format;
+    str+="\r\n";
+    std::string bufstr = str.toStdString();
+    const char* buf = bufstr.c_str();
+    buf_len = strlen(buf);
+    if(uapi_uart_tx_data((void*)buf, buf_len)){
+        ret=true;
+    }
+    return ret;
+}
+
+bool At_Process::at_send_cmd_string(at_module_id module_id, at_cmd_id cmd_id,QString format)
+{
+    char *buf = nullptr;
+    uint32_t buf_len=0;
+    bool ret=false;
+    QByteArray arr = format.toLatin1();
+    buf = arr.data();
+    buf_len = arr.size();
+    if (uapi_at_send(module_id, cmd_id, (uint8_t *)buf, buf_len, at_callback) == SUCC) {
+        at_set_id(module_id, cmd_id);
+        ret=true;
+    }
+    return ret;
+}
+
+void At_Process::at_set_id(at_module_id at_module_id_temp, at_cmd_id at_cmd_id_temp)
+{
+    at_module_id_save = at_module_id_temp;
+    at_cmd_id_save = at_cmd_id_temp;
+}
+
+void At_Process::at_get_id(at_module_id *at_module_id, at_cmd_id *at_cmd_id)
+{
+    *at_module_id = at_module_id_save;
+    *at_cmd_id = at_cmd_id_save;
+}
index c946a0e..0e5f0f0 100644 (file)
@@ -1,66 +1,66 @@
-#include "dialogsettings.h"\r
-#include <QDebug>\r
-#include "settings.h"\r
-#include <QMetaObject>\r
-DialogSettings::DialogSettings():g_dialogSettings(new Ui::Dialog())\r
-{\r
-    g_dialogSettings->setupUi(this);\r
-//    QMetaObject::connect(&settings::getInstance(),SIGNAL(update_process()),this,SLOT(update_process()));\r
-    update_view();\r
-\r
-}\r
-\r
-void DialogSettings::accept()\r
-{\r
-  qDebug()<<"accept ";\r
-//  this->close();\r
-  settings::getInstance().create_new_database();\r
-  this->done(1);\r
-}\r
-\r
-void DialogSettings::reject()\r
-{\r
-    qDebug()<<"reject";\r
-//    this->close();\r
-    this->done(0);\r
-}\r
-void DialogSettings::update_process(int percent)\r
-{\r
-    if (percent>0 && percent <=100)\r
-        g_dialogSettings->progressBar->setValue(percent);\r
-}\r
-\r
-void DialogSettings::update_view()\r
-{\r
-    qDebug()<<"update_view";\r
-    QString prefix=g_dialogSettings->lineedit_prefix->text();\r
-    QString mac_start=g_dialogSettings->lineedit_mac_start->text();\r
-    QString mac_count=g_dialogSettings->lineedit_mac_count->text();\r
-    bool num_is_ok=true;\r
-    QString status="";\r
-    if (mac_start.length() != 6 )\r
-    {\r
-        qDebug()<< "mac_start !=  6";\r
-        status.append(QString::fromLocal8Bit("mac地址开始长度只能为6!\n"));\r
-        num_is_ok = false;\r
-    }\r
-    if (prefix.length() != 6)\r
-    {\r
-        qDebug()<< "prefix !=  6";\r
-        status.append(QString::fromLocal8Bit("mac地址固定头长度只能为6!\n"));\r
-        num_is_ok = false;\r
-    }\r
-    if (num_is_ok == true)\r
-    {\r
-        int ret = settings::getInstance().mac_config(prefix,mac_count,mac_start);\r
-        qDebug()<< "save settings ret "<<ret;\r
-        if (ret == 0)\r
-            status.append(settings::getInstance().getmacStatus());\r
-        else if (ret == 1)\r
-            status.append(QString::fromLocal8Bit("mac地址数量过大"));\r
-        else\r
-            status.append(QString::fromLocal8Bit("mac地址生成失败,错误码")).append(ret);\r
-    }\r
-     g_dialogSettings->label_mac_status->setText(status);\r
-\r
-}\r
+#include "dialogsettings.h"
+#include <QDebug>
+#include "settings.h"
+#include <QMetaObject>
+DialogSettings::DialogSettings():g_dialogSettings(new Ui::Dialog())
+{
+    g_dialogSettings->setupUi(this);
+//    QMetaObject::connect(&settings::getInstance(),SIGNAL(update_process()),this,SLOT(update_process()));
+    update_view();
+
+}
+
+void DialogSettings::accept()
+{
+  qDebug()<<"accept ";
+//  this->close();
+  settings::getInstance().create_new_database();
+  this->done(1);
+}
+
+void DialogSettings::reject()
+{
+    qDebug()<<"reject";
+//    this->close();
+    this->done(0);
+}
+void DialogSettings::update_process(int percent)
+{
+    if (percent>0 && percent <=100)
+        g_dialogSettings->progressBar->setValue(percent);
+}
+
+void DialogSettings::update_view()
+{
+    qDebug()<<"update_view";
+    QString prefix=g_dialogSettings->lineedit_prefix->text();
+    QString mac_start=g_dialogSettings->lineedit_mac_start->text();
+    QString mac_count=g_dialogSettings->lineedit_mac_count->text();
+    bool num_is_ok=true;
+    QString status="";
+    if (mac_start.length() != 6 )
+    {
+        qDebug()<< "mac_start !=  6";
+        status.append(tr("mac地址开始长度只能为6!\n"));
+        num_is_ok = false;
+    }
+    if (prefix.length() != 6)
+    {
+        qDebug()<< "prefix !=  6";
+        status.append(tr("mac地址固定头长度只能为6!\n"));
+        num_is_ok = false;
+    }
+    if (num_is_ok == true)
+    {
+        int ret = settings::getInstance().mac_config(prefix,mac_count,mac_start);
+        qDebug()<< "save settings ret "<<ret;
+        if (ret == 0)
+            status.append(settings::getInstance().getmacStatus());
+        else if (ret == 1)
+            status.append(tr("mac地址数量过大"));
+        else
+            status.append(tr("mac地址生成失败,错误码")).append(ret);
+    }
+     g_dialogSettings->label_mac_status->setText(status);
+
+}
index 177bfa0..484b407 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -1,10 +1,15 @@
-#include "mainwindow.h"\r
-#include <QApplication>\r
-\r
-int main(int argc, char *argv[])\r
-{\r
-    QApplication a(argc, argv);\r
-    MainWindow w;\r
-    w.show();\r
-    return a.exec();\r
-}\r
+#include "mainwindow.h"
+#include <QApplication>
+#include <QTextCodec>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    
+    // 设置应用程序的文本编码为UTF-8
+    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
+    
+    MainWindow w;
+    w.show();
+    return a.exec();
+}
index cbbe2e5..0a47afd 100644 (file)
-#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();
+
+}
+
+
index bd39ea7..609d94d 100644 (file)
-#ifndef MAINWINDOW_H\r
-#define MAINWINDOW_H\r
-\r
-#include <Windows.h>\r
-#include <stdio.h>\r
-#include <QCompleter>\r
-#include <QMainWindow>\r
-#include <QSettings>\r
-#include <QTimer>\r
-#include "result_thread.h"\r
-#include "QFileDialog"\r
-#include "QMessageBox"\r
-#include "QTime"\r
-#include "common.h"\r
-#include <qt_windows.h>\r
-#include <QSerialPortInfo>\r
-#include <QSerialPort>\r
-\r
-#include "sqldbmanager.h"\r
-\r
-#include "settings.h"\r
-\r
-#define COM_NUMBER 10\r
-\r
-// 封装了UI上需要调用的所有函数接口\r
-QT_BEGIN_NAMESPACE\r
-namespace Ui {\r
-class MainWindow;\r
-}\r
-QT_END_NAMESPACE\r
-\r
-class MainWindow : public QMainWindow {\r
-    Q_OBJECT\r
-\r
-public:\r
-    MainWindow(QWidget *parent = nullptr);\r
-    ~MainWindow();\r
-    QString G_cmd;\r
-\r
-private:\r
-    Ui::MainWindow *ui;\r
-    bool LOG_DIRECT_OUT=false;\r
-    bool LOG_DIRECT_IN=true;\r
-    /* ------------------------uart------------------------------- */\r
-    Result_Thread *result_thread1;\r
-\r
-\r
-    /*----------写地址任务相关变量---------------*/\r
-    QSerialPort *serialport1;\r
-    //指令长度\r
-    qint64 m_bytesToWrite1=0;\r
-    //指令顺序, AT =0 , SET_MAC = 1 , GET_MAC = 2 , GET_CPUINFO = 3;\r
-    int cmd_index_1=0;\r
-    int write_success_count1=0;\r
-    int write_fail_count1=0;\r
-\r
-    // 是否忽略uart数据,不回显\r
-    bool uart_rx_Ignoring_display {false};\r
-    // 是否有uart通路数据上报\r
-    bool uart_rx_flag1 {false};\r
-    QByteArray uart_rx_buff_array1;\r
-    QTimer *spp_timer_handle1 {nullptr};\r
-    bool working_state_1=false; //true 说明写号执行过程中,false说明写号结束\r
-    bool waiting_cmd1 = false;//发现开机后,等待下达cmd指令\r
-    void ui_display1(QString str,bool inOrOut);\r
-    void ui_show_result1(QString msg,bool success);\r
-    void poweroff_watch1();\r
-\r
-    /*----------写地址任务相关变量---end------------*/\r
-\r
-\r
-//    bool dongle_is_connected {false};\r
-//    int dongle_connected_times {0};\r
-    QStringList uart_get_enable_comm_or_port();\r
-    QString uart_get_comm_or_port(int nIndex, bool bValue);\r
-\r
-    /* ------------------------spp-------------------------------- */\r
-\r
-//    QTimer *spp_connected_handle {nullptr};\r
-//    int dongle_try_count {0};\r
-//    int spp_try_count {0};\r
-\r
-    void uart_send_data1(QString cmd);\r
-\r
-\r
-    QSerialPort *serialport2;\r
-    QSerialPort *serialport3;\r
-    QSerialPort *serialport4;\r
-    Result_Thread *result_thread2;\r
-    Result_Thread *result_thread3;\r
-    Result_Thread *result_thread4;\r
-\r
-\r
-    /* -------------------------UI------------------------------- */\r
-    enum ui_page{\r
-        PAGE_COMPLETE,\r
-        PAGE_BOARD,\r
-    };\r
-    void ui_setting_save();\r
-    void ui_setting_read();\r
-\r
-\r
-    void ui_display2(QString str,bool inOrOut);\r
-    void ui_display3(QString str,bool inOrOut);\r
-    void ui_display4(QString str,bool inOrOut);\r
-//    void at_check_send_status(bool flag);\r
-\r
-    void uart_send_data2(QString cmd);\r
-    void uart_send_data3(QString cmd);\r
-    void uart_send_data4(QString cmd);\r
-    /* ------------------------end------------------------------ */\r
-\r
-\r
-\r
-private slots:\r
-    /* --------------------------UI------------------------------ */\r
-    void ui_save_windows();\r
-    /* -------------------------uart----------------------------- */\r
-\r
-\r
-\r
-    void uart_com_select();\r
-    void uart_com_switch(QString com);\r
-    void uart_baud_switch(QString baud);\r
-\r
-    /* -------------------------cfg------------------------------- */\r
-    void ui_open_mac_config();\r
-\r
-    /* ------------------------------------------------------------- */\r
-    void openLogfolder();\r
-    /* -------------------------spp------------------------------- */\r
-\r
-    /**********串口写地址任务相关 slot定义*******************************/\r
-    //读取串口返回数据\r
-    void readData1();\r
-    //解析返回指令\r
-    void uart_process1();\r
-    //执行连接com并开始等待设备开机,断开串口连接,并停止接收数据\r
-    void spp_connect_1();\r
-    //检测指令是否超时\r
-    void spp_timer_callback1();\r
-    //检测指令是否下达完成\r
-    void handleBytesWritten1(qint64 bytes);\r
-\r
-    /*****************************************/\r
-\r
-    void readData2();\r
-    void readData3();\r
-    void readData4();\r
-    void uart_process2();\r
-    void uart_process3();\r
-    void uart_process4();\r
-    void spp_connect_2();\r
-    void spp_connect_3();\r
-    void spp_connect_4();\r
-    void spp_timer_callback2();\r
-    void spp_timer_callback3();\r
-    void spp_timer_callback4();\r
-\r
-    void spp_connect_all();\r
-    void spp_connected_callback();\r
-    void uart_rx_dispaly1(int buf_len, u8Piont buf);\r
-\r
-};\r
-#endif // MAINWINDOW_H\r
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <Windows.h>
+#include <stdio.h>
+#include <QCompleter>
+#include <QMainWindow>
+#include <QSettings>
+#include <QTimer>
+#include "result_thread.h"
+#include "QFileDialog"
+#include "QMessageBox"
+#include "QTime"
+#include "common.h"
+#include <qt_windows.h>
+#include <QSerialPortInfo>
+#include <QSerialPort>
+
+#include "sqldbmanager.h"
+
+#include "settings.h"
+
+#define COM_NUMBER 10
+
+// 封装了UI上需要调用的所有函数接口
+QT_BEGIN_NAMESPACE
+namespace Ui {
+class MainWindow;
+}
+QT_END_NAMESPACE
+
+class MainWindow : public QMainWindow {
+    Q_OBJECT
+
+public:
+    MainWindow(QWidget *parent = nullptr);
+    ~MainWindow();
+    QString G_cmd;
+
+private:
+    Ui::MainWindow *ui;
+    bool LOG_DIRECT_OUT=false;
+    bool LOG_DIRECT_IN=true;
+    /* ------------------------uart------------------------------- */
+    Result_Thread *result_thread1;
+
+
+    /*----------写地址任务相关变量---------------*/
+    QSerialPort *serialport1;
+    //指令长度
+    qint64 m_bytesToWrite1=0;
+    //指令顺序, AT =0 , SET_MAC = 1 , GET_MAC = 2 , GET_CPUINFO = 3;
+    int cmd_index_1=0;
+    int write_success_count1=0;
+    int write_fail_count1=0;
+
+    // 是否忽略uart数据,不回显
+    bool uart_rx_Ignoring_display {false};
+    // 是否有uart通路数据上报
+    bool uart_rx_flag1 {false};
+    QByteArray uart_rx_buff_array1;
+    QTimer *spp_timer_handle1 {nullptr};
+    bool working_state_1=false; //true 说明写号执行过程中,false说明写号结束
+    bool waiting_cmd1 = false; //等待命令时机
+    bool startup_complete_detected = false; //启动完成信号已检测标志
+    // bool setuart_sent = false; //SETUART指令是否已发送标志 (已注释:不再使用SETUART)
+    QByteArray boot_detect_buffer; //用于缓存开机检测数据,处理分包情况
+    void ui_display1(QString str,bool inOrOut);
+    void ui_show_result1(QString msg,bool success);
+    void poweroff_watch1();
+
+    /*----------写地址任务相关变量---end------------*/
+
+
+//    bool dongle_is_connected {false};
+//    int dongle_connected_times {0};
+    QStringList uart_get_enable_comm_or_port();
+    QString uart_get_comm_or_port(int nIndex, bool bValue);
+
+    /* ------------------------spp-------------------------------- */
+
+//    QTimer *spp_connected_handle {nullptr};
+//    int dongle_try_count {0};
+//    int spp_try_count {0};
+
+    void uart_send_data1(QString cmd);
+
+
+    QSerialPort *serialport2;
+    QSerialPort *serialport3;
+    QSerialPort *serialport4;
+    Result_Thread *result_thread2;
+    Result_Thread *result_thread3;
+    Result_Thread *result_thread4;
+
+
+    /* -------------------------UI------------------------------- */
+    enum ui_page{
+        PAGE_COMPLETE,
+        PAGE_BOARD,
+    };
+    void ui_setting_save();
+    void ui_setting_read();
+
+
+    void ui_display2(QString str,bool inOrOut);
+    void ui_display3(QString str,bool inOrOut);
+    void ui_display4(QString str,bool inOrOut);
+//    void at_check_send_status(bool flag);
+
+    void uart_send_data2(QString cmd);
+    void uart_send_data3(QString cmd);
+    void uart_send_data4(QString cmd);
+    /* ------------------------end------------------------------ */
+
+
+
+private slots:
+    /* --------------------------UI------------------------------ */
+    void ui_save_windows();
+    /* -------------------------uart----------------------------- */
+
+
+
+    void uart_com_select();
+    void uart_com_switch(QString com);
+    void uart_baud_switch(QString baud);
+
+    /* -------------------------cfg------------------------------- */
+    void ui_open_mac_config();
+
+    /* ------------------------------------------------------------- */
+    void openLogfolder();
+    /* -------------------------spp------------------------------- */
+
+    /**********串口写地址任务相关 slot定义*******************************/
+    //读取串口返回数据
+    void readData1();
+    //解析返回指令
+    void uart_process1();
+    //执行连接com并开始等待设备开机,断开串口连接,并停止接收数据
+    void spp_connect_1();
+    //检测指令是否超时
+    void spp_timer_callback1();
+    //检测指令是否下达完成
+    void handleBytesWritten1(qint64 bytes);
+
+    /*****************************************/
+
+    void readData2();
+    void readData3();
+    void readData4();
+    void uart_process2();
+    void uart_process3();
+    void uart_process4();
+    void spp_connect_2();
+    void spp_connect_3();
+    void spp_connect_4();
+    void spp_timer_callback2();
+    void spp_timer_callback3();
+    void spp_timer_callback4();
+
+    void spp_connect_all();
+    void spp_connected_callback();
+    void uart_rx_dispaly1(int buf_len, u8Piont buf);
+
+};
+#endif // MAINWINDOW_H
index be0f8bc..4448ba9 100644 (file)
@@ -1,42 +1,42 @@
-#ifndef RESULT_THREAD_H\r
-#define RESULT_THREAD_H\r
-#include "mythread.h"\r
-#include <stdint.h>\r
-#include <QMutex>\r
-#include <QWaitCondition>\r
-#include <qdebug.h>\r
-#include "common.h"\r
-#define BUF_SIZE 4096\r
-#define MLOCK_TIMEOUT 2000\r
-enum get_data_flag\r
-{\r
-    NONE_DATA = -1,\r
-    UART_RX_DATA = 0,\r
-    LS_RESULT_DATA,\r
-    TRANSMIT_FILE_DATA,\r
-    AT_RESULT_DATA,\r
-};\r
-\r
-struct result_info{\r
-    // uart收到的数据\r
-    int uart_rx_buf_len;\r
-    uint8_t *uart_rx_buf;\r
-    // 当前回调函数标记\r
-    int result_thread_flag;\r
-\r
-};\r
-\r
-class Result_Thread : public MyThread\r
-{\r
-public:\r
-    Result_Thread(QObject *parent = 0,uint8_t _port_index = 0);\r
-    ~Result_Thread();\r
-protected:\r
-     void process() override final;\r
-private:\r
-     QObject *obj;\r
-     uint8_t port_index;\r
-};\r
-\r
-uint32_t uart_callback(void *buf, uint32_t buf_len , uint8_t port_index);\r
-#endif // RESULT_THREAD_H\r
+#ifndef RESULT_THREAD_H
+#define RESULT_THREAD_H
+#include "mythread.h"
+#include <stdint.h>
+#include <QMutex>
+#include <QWaitCondition>
+#include <qdebug.h>
+#include "common.h"
+#define BUF_SIZE 16384
+#define MLOCK_TIMEOUT 2000
+enum get_data_flag
+{
+    NONE_DATA = -1,
+    UART_RX_DATA = 0,
+    LS_RESULT_DATA,
+    TRANSMIT_FILE_DATA,
+    AT_RESULT_DATA,
+};
+
+struct result_info{
+    // uart收到的数据
+    int uart_rx_buf_len;
+    uint8_t *uart_rx_buf;
+    // 当前回调函数标记
+    int result_thread_flag;
+
+};
+
+class Result_Thread : public MyThread
+{
+public:
+    Result_Thread(QObject *parent = 0,uint8_t _port_index = 0);
+    ~Result_Thread();
+protected:
+     void process() override final;
+private:
+     QObject *obj;
+     uint8_t port_index;
+};
+
+uint32_t uart_callback(void *buf, uint32_t buf_len , uint8_t port_index);
+#endif // RESULT_THREAD_H
index 1e690fb..6ffb459 100644 (file)
-#include "settings.h"\r
-#include <QSettings>\r
-#include <QDebug>\r
-settings* settings::instance = NULL;\r
-settings& settings::getInstance()\r
-{\r
-    /*\r
-    * 双重锁定,减少每次开销,只有越过if(NULL == instance) 才需要锁定,极低概率\r
-    */\r
-    if(NULL == instance)\r
-    {\r
-\r
-        if(NULL == instance)\r
-        {\r
-            instance = new settings();\r
-        }\r
-\r
-    }\r
-    return *instance;\r
-}\r
-\r
-void settings::release()\r
-{\r
-    if(instance != NULL)\r
-    {\r
-\r
-        delete instance;\r
-        instance = NULL;\r
-\r
-    }\r
-}\r
-\r
-void settings::load_settings()\r
-{\r
-    qDebug()<<"load_settings";\r
-    this->mac_start_fullstr =sqlitemanager->get_mac_start();\r
-    this->mac_end_fullstr =sqlitemanager->get_mac_end();\r
-    this->mac_count = sqlitemanager->get_mac_count();\r
-    qDebug()<<this->getmacStatus();\r
-}\r
-\r
-int settings::mac_config(QString _mac_pre,QString _mac_count,QString _mac_start_hexstr)\r
-{\r
-    mac_pre_head_hexstr = _mac_pre;\r
-    mac_start_hexstr = _mac_start_hexstr;\r
-    bool ok;\r
-    int ret =0;\r
-    mac_status_flag =  true;\r
-    mac_count = _mac_count.toInt(&ok,10);\r
-    qDebug()<<" == mac_count "<< mac_count << ok;\r
-    if(!ok)\r
-    {\r
-        mac_status_flag = false;\r
-        ret = 2 ;\r
-    }\r
-\r
-    mac_pre_head = mac_pre_head_hexstr.toUInt(&ok,16);\r
-    qDebug()<<" == mac_pre_head_hexstr "<< mac_pre_head_hexstr << mac_pre_head << ok;\r
-    if(!ok)\r
-    {\r
-        mac_status_flag = false;\r
-        ret = 2;\r
-    }\r
-\r
-    mac_start = mac_start_hexstr.toUInt(&ok,16);\r
-    qDebug()<<" == mac_start_hexstr "<< mac_start_hexstr << mac_start << ok;\r
-    if(!ok)\r
-    {\r
-        mac_status_flag = false;\r
-        ret = 2;\r
-    }\r
-\r
-    mac_end_hexstr = QString("%1").arg((mac_count+mac_start), 6, 16, QLatin1Char( '0' )).toUpper();\r
-    qDebug()<<" == mac_end_hexstr "<<mac_end_hexstr;\r
-    if(!ok)\r
-    {\r
-        mac_status_flag = false;\r
-        ret = 2;\r
-    }\r
-    if(mac_end_hexstr.trimmed().length()>6)\r
-    {\r
-        mac_status_flag = false;\r
-        qDebug()<<"数量过多";\r
-        ret = 1;\r
-    }\r
-    mac_start_fullstr=mac_pre_head_hexstr+mac_start_hexstr;\r
-    mac_end_fullstr=mac_pre_head_hexstr+mac_end_hexstr;\r
-    qDebug()<<QString::fromLocal8Bit("格式正确?")<<mac_status_flag << " ret " << ret;\r
-    return ret;\r
-}\r
-bool settings::getMacUsed(QString mac)\r
-{\r
-    return sqlitemanager->is_mac_used(mac);\r
-}\r
-\r
-QString settings::getAvalibleMac()\r
-{\r
-    return sqlitemanager->get_avalible_mac();\r
-}\r
-\r
-int settings::set_mac_used(QString mac,QString uid,bool used)\r
-{\r
-    return sqlitemanager->set_mac_used(mac,uid,used);\r
-}\r
-\r
-QString settings::getmacStatus()\r
-{\r
-    QString ret="";\r
-    if (mac_status_flag == false)\r
-    {\r
-        ret.append(QString::fromLocal8Bit("mac地址格式错误"));\r
-    }else\r
-    {\r
-\r
-        ret.append(mac_start_fullstr);\r
-        ret.append(QString::fromLocal8Bit("直到"));\r
-        ret.append(mac_end_fullstr).append("\n");\r
-        ret.append( QString::fromLocal8Bit("总共") );\r
-        ret.append(QString().setNum(mac_count)).append(QString::fromLocal8Bit("个地址"));\r
-\r
-    }\r
-    return ret;\r
-}\r
-QString settings::getmacStatusFull()\r
-{\r
-    int used_count = sqlitemanager->get_mac_used_count();\r
-    QString ret = getmacStatus();\r
-    ret = ret.append(QString::fromLocal8Bit("\n已用%1")).arg(used_count);\r
-    ret = ret.append(QString::fromLocal8Bit("\n剩余%1")).arg(mac_count-used_count);\r
-    return ret;\r
-}\r
-\r
-int settings::gen_new_mac()\r
-{\r
-    int ret = 0;\r
-    qDebug() << "mac_start " << mac_start;\r
-    qDebug()<< "mac_count " << mac_count;\r
-    for (uint i = 0; i < this->mac_count;i++)\r
-    {\r
-        QString mac_tmp="";\r
-        mac_tmp.append(this->mac_pre_head_hexstr);\r
-        QString mac_end_str =  QString("%1").arg((mac_start+i), 6, 16, QLatin1Char( '0' )).toUpper();\r
-        mac_tmp.append(mac_end_str);\r
-        ret = sqlitemanager->insert_mac_addr(i,mac_tmp);\r
-//        emit update_process(i/mac_count);\r
-        qDebug()<< "insert "<< i <<" "<< mac_tmp <<" ret " << ret;\r
-    }\r
-    return ret;\r
-}\r
-\r
-int settings::create_new_database()\r
-{\r
-   if (mac_status_flag == false )\r
-   {\r
-       qDebug()<<"mac_status_flag false skip craete database";\r
-       return 0;\r
-   }\r
-   int ret =  sqlitemanager->create_db_tables();\r
-\r
-   if (ret == 1)\r
-   {\r
-        mac_start_fullstr=mac_pre_head_hexstr+mac_start_hexstr;\r
-        mac_end_fullstr=mac_pre_head_hexstr+mac_end_hexstr;\r
-        sqlitemanager->set_mac_cfg(mac_start_fullstr,mac_end_fullstr,mac_count);\r
-        gen_new_mac();\r
-   }else if (ret == 2)\r
-   {\r
-        int count = sqlitemanager->get_mac_count();\r
-        if (count > 0 )\r
-        {\r
-\r
-            qDebug()<<"mac count "<<count <<" already has data , no need update!";\r
-            return 0;\r
-        }\r
-\r
-        gen_new_mac();\r
-   }else{\r
-       qDebug()<< "create_database failed " ;\r
-       return 0;\r
-   }\r
-    return 1;\r
-}\r
-\r
-settings::settings(QObject *parent): QObject(parent)\r
-{\r
-//    QSettings *settings = new QSettings(setting_path, 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
-\r
-//    delete settings;\r
-//    settings = nullptr;\r
-\r
-    sqlitemanager = new DbManager("mac_address.db");\r
-}\r
-\r
+#include "settings.h"
+#include <QSettings>
+#include <QDebug>
+settings* settings::instance = NULL;
+settings& settings::getInstance()
+{
+    /*
+    * 双重锁定,减少每次开销,只有越过if(NULL == instance) 才需要锁定,极低概率
+    */
+    if(NULL == instance)
+    {
+
+        if(NULL == instance)
+        {
+            instance = new settings();
+        }
+
+    }
+    return *instance;
+}
+
+void settings::release()
+{
+    if(instance != NULL)
+    {
+
+        delete instance;
+        instance = NULL;
+
+    }
+}
+
+void settings::load_settings()
+{
+    qDebug()<<"load_settings";
+    this->mac_start_fullstr =sqlitemanager->get_mac_start();
+    this->mac_end_fullstr =sqlitemanager->get_mac_end();
+    this->mac_count = sqlitemanager->get_mac_count();
+    qDebug()<<this->getmacStatus();
+}
+
+int settings::mac_config(QString _mac_pre,QString _mac_count,QString _mac_start_hexstr)
+{
+    mac_pre_head_hexstr = _mac_pre;
+    mac_start_hexstr = _mac_start_hexstr;
+    bool ok;
+    int ret =0;
+    mac_status_flag =  true;
+    mac_count = _mac_count.toInt(&ok,10);
+    qDebug()<<" == mac_count "<< mac_count << ok;
+    if(!ok)
+    {
+        mac_status_flag = false;
+        ret = 2 ;
+    }
+
+    mac_pre_head = mac_pre_head_hexstr.toUInt(&ok,16);
+    qDebug()<<" == mac_pre_head_hexstr "<< mac_pre_head_hexstr << mac_pre_head << ok;
+    if(!ok)
+    {
+        mac_status_flag = false;
+        ret = 2;
+    }
+
+    mac_start = mac_start_hexstr.toUInt(&ok,16);
+    qDebug()<<" == mac_start_hexstr "<< mac_start_hexstr << mac_start << ok;
+    if(!ok)
+    {
+        mac_status_flag = false;
+        ret = 2;
+    }
+
+    mac_end_hexstr = QString("%1").arg((mac_count+mac_start), 6, 16, QLatin1Char( '0' )).toUpper();
+    qDebug()<<" == mac_end_hexstr "<<mac_end_hexstr;
+    if(!ok)
+    {
+        mac_status_flag = false;
+        ret = 2;
+    }
+    if(mac_end_hexstr.trimmed().length()>6)
+    {
+        mac_status_flag = false;
+        qDebug()<<"数量过多";
+        ret = 1;
+    }
+    mac_start_fullstr=mac_pre_head_hexstr+mac_start_hexstr;
+    mac_end_fullstr=mac_pre_head_hexstr+mac_end_hexstr;
+    qDebug()<<tr("格式正确?")<<mac_status_flag << " ret " << ret;
+    return ret;
+}
+bool settings::getMacUsed(QString mac)
+{
+    return sqlitemanager->is_mac_used(mac);
+}
+
+QString settings::getAvalibleMac()
+{
+    return sqlitemanager->get_avalible_mac();
+}
+
+int settings::set_mac_used(QString mac,QString uid,bool used)
+{
+    return sqlitemanager->set_mac_used(mac,uid,used);
+}
+
+QString settings::getmacStatus()
+{
+    QString ret="";
+    if (mac_status_flag == false)
+    {
+        ret.append(tr("mac地址格式错误"));
+    }else
+    {
+
+        ret.append(mac_start_fullstr);
+        ret.append(tr("直到"));
+        ret.append(mac_end_fullstr).append("\n");
+        ret.append( tr("总共") );
+        ret.append(QString().setNum(mac_count)).append(tr("个地址"));
+
+    }
+    return ret;
+}
+QString settings::getmacStatusFull()
+{
+    int used_count = sqlitemanager->get_mac_used_count();
+    QString ret = getmacStatus();
+    ret = ret.append(tr("\n已用%1")).arg(used_count);
+    ret = ret.append(tr("\n剩余%1")).arg(mac_count-used_count);
+    return ret;
+}
+
+int settings::gen_new_mac()
+{
+    int ret = 0;
+    qDebug() << "mac_start " << mac_start;
+    qDebug()<< "mac_count " << mac_count;
+    for (uint i = 0; i < this->mac_count;i++)
+    {
+        QString mac_tmp="";
+        mac_tmp.append(this->mac_pre_head_hexstr);
+        QString mac_end_str =  QString("%1").arg((mac_start+i), 6, 16, QLatin1Char( '0' )).toUpper();
+        mac_tmp.append(mac_end_str);
+        ret = sqlitemanager->insert_mac_addr(i,mac_tmp);
+//        emit update_process(i/mac_count);
+        qDebug()<< "insert "<< i <<" "<< mac_tmp <<" ret " << ret;
+    }
+    return ret;
+}
+
+int settings::create_new_database()
+{
+   if (mac_status_flag == false )
+   {
+       qDebug()<<"mac_status_flag false skip craete database";
+       return 0;
+   }
+   int ret =  sqlitemanager->create_db_tables();
+
+   if (ret == 1)
+   {
+        mac_start_fullstr=mac_pre_head_hexstr+mac_start_hexstr;
+        mac_end_fullstr=mac_pre_head_hexstr+mac_end_hexstr;
+        sqlitemanager->set_mac_cfg(mac_start_fullstr,mac_end_fullstr,mac_count);
+        gen_new_mac();
+   }else if (ret == 2)
+   {
+        int count = sqlitemanager->get_mac_count();
+        if (count > 0 )
+        {
+
+            qDebug()<<"mac count "<<count <<" already has data , no need update!";
+            return 0;
+        }
+
+        gen_new_mac();
+   }else{
+       qDebug()<< "create_database failed " ;
+       return 0;
+   }
+    return 1;
+}
+
+settings::settings(QObject *parent): QObject(parent)
+{
+//    QSettings *settings = new QSettings(setting_path, 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;
+
+    sqlitemanager = new DbManager("mac_address.db");
+}
+
index bc65ae4..20bc4fd 100644 (file)
-#ifndef SETTINGS_H\r
-#define SETTINGS_H\r
-#include <QByteArray>\r
-#include <QString>\r
-#include <QDateTime>\r
-#include <QObject>\r
-#include "sqldbmanager.h"\r
-\r
-/*\r
- *\r
-» AT^BTADDR=281106010101 6\r
-« package_common_cmd_to_bt strCmd 36 5A 00 09 00 09 04 inParam 281106010101 6 para_len 15\r
-commandID = 0x4 payload_len=15\r
-bt_manager_at_process cmdId=0x4 atId=0x904\r
-gap_scan_mode_changed_callback mode: 0\r
-APP|[WEARABLE E/] sample_gap_scan_mode_changed_callback: sample_gap_scan_mode_changed_callback: Mobile Phone Device\r
-gap_scan_mode_changed_callback mode: 4\r
-APP|[WEARABLE E/] sample_gap_scan_mode_changed_callback: sample_gap_scan_mode_changed_callback: Mobile Phone Device\r
-bluetooth_set_local_addr OK\r
-\r
-OK~\r
-\r
-\r
-» AT^BTADDR?\r
-« package_common_cmd_to_bt strCmd 36 5A 00 03 00 09 05 BA 62 inParam (null) para_len 0\r
-commandID = 0x5 payload_len=0\r
-bt_manager_at_process cmdId=0x5 atId=0x905\r
-\r
-local_addr : 28*****010101\r
-\r
-OK~\r
-\r
-\r
-» AT^GETIDS\r
-« [nandflash id:] c881\r
-[norflash id:] 1860c8\r
-[sdk id:]1.3.83\r
-[soc id:]\r
-0x0974  0x1744  0xEF04  0x2185\r
-0xBDD7  0xC80B  0x030A  0x7578\r
-0x8221  0x0001\r
-\r
-OK~\r
-\r
-*/\r
-#define ATCMD_SET_MAC "AT^BTADDR=%1 6\r\n"\r
-/*gap_scan_mode_changed_callback mode: 4\r
-bluetooth_set_local_addr OK\r
-OK~\r
-*/\r
-#define ATCMD_GET_CPUID "AT^GETIDS\r\n"\r
-/*\r
-» AT^GETIDS\r
-« APP|charger not plugged ,disable charge !\r
-[nandflash id:] c881\r
-[norflash id:] 1860c8\r
-[sdk id:]1.3.85\r
-[soc id:]\r
-0x0974  0x1744  0xEF04  0x2185\r
-0xBDD7  0xC80B  0x030A  0x7578\r
-0x8221  0x0001\r
-\r
-OK~\r
-*/\r
-#define ATCMD_GET_MAC "AT^BTADDR?\r\n"\r
-/*\r
-» AT^BTADDR?\r
-« package_common_cmd_to_bt strCmd 36 5A 00 03 00 09 05 BA 62 inParam (null) para_len 0\r
-commandID = 0x5 payload_len=0\r
-bt_manager_at_process cmdId=0x5 atId=0x905\r
-\r
-local_addr : 28*****010101\r
-\r
-OK~\r
-*/\r
-#define BOOT_UP_MSG "yaffs filesystem init start"\r
-#define TIME_FOR_CMD "bt enable_bt_stack ret"\r
-#define ATCMD_ADD_VOTE "AT^PMADDVOTE\r\n"\r
-/*\r
-AT^PMADDVOTE\r
-MCU has got pm_id_debug vote\r
-MCU WAKEUP SUCCESS\r
-OK~\r
-*/\r
-#define ATCMD_REMOVE_VOTE "AT^PMRMVOTE\r\n"\r
-/*\r
-AT^PMADDVOTE\r
-MCU SLEEP SUCCESS\r
-OK~\r
-*/\r
-\r
-#define ATCMD_POWEROFF "AT^POWEROFF\r\n"\r
-/*\r
-» AT^POWEROFF\r
-« power off device!\r
-*/\r
-#define MAC_LEN 12\r
-class settings : public QObject\r
-{\r
-//    Q_OBJECT\r
-\r
-public:\r
-    static settings& getInstance(); //获取settings的唯一对象\r
-    static void release();\r
-\r
-    settings(QObject *parent=nullptr);\r
-    int create_new_database();\r
-    void load_settings();\r
-    int mac_config(QString _mac_pre,QString _mac_count,QString _mac_start_hexstr);\r
-    int set_mac_used(QString mac,QString uid,bool used);\r
-    bool getMacUsed(QString mac);\r
-    QString getAvalibleMac();\r
-    QString getmacStatus();\r
-    QString getmacStatusFull();\r
-\r
-//Q_SIGNALS:\r
-//    void update_process(int percent);\r
-\r
-private:\r
-    int gen_new_mac();\r
-    QString setting_path="Setting.ini";\r
-    QString mac_pre_head_hexstr;\r
-    uint mac_pre_head;\r
-    uint mac_count;\r
-    QString mac_start_hexstr;\r
-    QString mac_end_hexstr;\r
-    QString mac_start_fullstr;\r
-    QString mac_end_fullstr;\r
-    uint mac_start;\r
-    int mac_used;\r
-    QDateTime cfg_updateTime;\r
-    static settings* instance;   //settings 全局唯一的变量\r
-    bool mac_status_flag=true;\r
-    DbManager *sqlitemanager{NULL};\r
-};\r
-\r
-#endif // SETTINGS_H\r
+#ifndef SETTINGS_H
+#define SETTINGS_H
+#include <QByteArray>
+#include <QString>
+#include <QDateTime>
+#include <QObject>
+#include "sqldbmanager.h"
+
+/*
+ *
+» AT^BTADDR=281106010101 6
+« package_common_cmd_to_bt strCmd 36 5A 00 09 00 09 04 inParam 281106010101 6 para_len 15
+commandID = 0x4 payload_len=15
+bt_manager_at_process cmdId=0x4 atId=0x904
+gap_scan_mode_changed_callback mode: 0
+APP|[WEARABLE E/] sample_gap_scan_mode_changed_callback: sample_gap_scan_mode_changed_callback: Mobile Phone Device
+gap_scan_mode_changed_callback mode: 4
+APP|[WEARABLE E/] sample_gap_scan_mode_changed_callback: sample_gap_scan_mode_changed_callback: Mobile Phone Device
+bluetooth_set_local_addr OK
+
+OK~
+
+
+» AT^BTADDR?
+« package_common_cmd_to_bt strCmd 36 5A 00 03 00 09 05 BA 62 inParam (null) para_len 0
+commandID = 0x5 payload_len=0
+bt_manager_at_process cmdId=0x5 atId=0x905
+
+local_addr : 28*****010101
+
+OK~
+
+
+» AT^GETIDS
+« [nandflash id:] c881
+[norflash id:] 1860c8
+[sdk id:]1.3.83
+[soc id:]
+0x0974  0x1744  0xEF04  0x2185
+0xBDD7  0xC80B  0x030A  0x7578
+0x8221  0x0001
+
+OK~
+
+*/
+#define ATCMD_SET_MAC "AT^BTADDR=%1 6\r\n"
+/*gap_scan_mode_changed_callback mode: 4
+bluetooth_set_local_addr OK
+OK~
+*/
+#define ATCMD_GET_CPUID "AT^GETIDS\r\n"
+/*
+» AT^GETIDS
+« APP|charger not plugged ,disable charge !
+[nandflash id:] c881
+[norflash id:] 1860c8
+[sdk id:]1.3.85
+[soc id:]
+0x0974  0x1744  0xEF04  0x2185
+0xBDD7  0xC80B  0x030A  0x7578
+0x8221  0x0001
+
+OK~
+*/
+#define ATCMD_GET_MAC "AT^GETBTMAC\r\n"
+/*
+» AT^GETBTMAC
+« fac:^^^^ BTMAC=28:11:06:4D:29:EF ^^^^ CyweeChipInfo=HS11g9LHov9p97100C5C20
+
+OK~
+*/
+#define BOOT_UP_MSG "yaffs filesystem init start"
+#define TIME_FOR_CMD "bt enable_bt_stack ret"
+#define STARTUP_POST_INIT "APP|startup_post_init !"
+#define STARTUP_POST_INIT_TASK "APP|startup_post_init_task !"
+#define ATCMD_ADD_VOTE "AT^PMADDVOTE\r\n"
+/*
+AT^PMADDVOTE
+MCU has got pm_id_debug vote
+MCU WAKEUP SUCCESS
+OK~
+*/
+#define ATCMD_REMOVE_VOTE "AT^PMRMVOTE\r\n"
+/*
+AT^PMADDVOTE
+MCU SLEEP SUCCESS
+OK~
+*/
+
+#define ATCMD_POWEROFF "AT^POWEROFF\r\n"
+/*
+» AT^POWEROFF
+« power off device!
+*/
+#define ATCMD_RESET "AT^RESET\r\n"
+/*
+» AT^RESET
+« 重启设备
+*/
+#define ATCMD_SETUART "AT^SETUART=1\r\n"
+/*
+» AT^SETUART=1
+« 设置UART参数
+*/
+#define MAC_LEN 12
+class settings : public QObject
+{
+//    Q_OBJECT
+
+public:
+    static settings& getInstance(); //获取settings的唯一对象
+    static void release();
+
+    settings(QObject *parent=nullptr);
+    int create_new_database();
+    void load_settings();
+    int mac_config(QString _mac_pre,QString _mac_count,QString _mac_start_hexstr);
+    int set_mac_used(QString mac,QString uid,bool used);
+    bool getMacUsed(QString mac);
+    QString getAvalibleMac();
+    QString getmacStatus();
+    QString getmacStatusFull();
+
+//Q_SIGNALS:
+//    void update_process(int percent);
+
+private:
+    int gen_new_mac();
+    QString setting_path="Setting.ini";
+    QString mac_pre_head_hexstr;
+    uint mac_pre_head;
+    uint mac_count;
+    QString mac_start_hexstr;
+    QString mac_end_hexstr;
+    QString mac_start_fullstr;
+    QString mac_end_fullstr;
+    uint mac_start;
+    int mac_used;
+    QDateTime cfg_updateTime;
+    static settings* instance;   //settings 全局唯一的变量
+    bool mac_status_flag=true;
+    DbManager *sqlitemanager{NULL};
+};
+
+#endif // SETTINGS_H