From: penglei <1624952103@qq.com> Date: Wed, 26 Nov 2025 12:25:46 +0000 (+0800) Subject: 优化蓝牙写号工具,适配650环境 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=9e15bf6a547fa04f803ba1a4efaba53629baf6e9;p=mirrors%2Ffactory_tool.git 优化蓝牙写号工具,适配650环境 --- diff --git a/HiBTMacWriteTool.pro b/HiBTMacWriteTool.pro index 15bd036..02f9591 100644 --- a/HiBTMacWriteTool.pro +++ b/HiBTMacWriteTool.pro @@ -1,55 +1,55 @@ -#------------------------------------------------- -# -# 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 +#------------------------------------------------- +# +# 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 diff --git a/at_data.cpp b/at_data.cpp index 1d76e0d..04e48ab 100644 --- a/at_data.cpp +++ b/at_data.cpp @@ -1,135 +1,135 @@ -#include - -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; -} +#include + +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; +} diff --git a/dialogsettings.cpp b/dialogsettings.cpp index c946a0e..0e5f0f0 100644 --- a/dialogsettings.cpp +++ b/dialogsettings.cpp @@ -1,66 +1,66 @@ -#include "dialogsettings.h" -#include -#include "settings.h" -#include -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(QString::fromLocal8Bit("mac地址开始长度只能为6!\n")); - num_is_ok = false; - } - if (prefix.length() != 6) - { - qDebug()<< "prefix != 6"; - status.append(QString::fromLocal8Bit("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 "<label_mac_status->setText(status); - -} +#include "dialogsettings.h" +#include +#include "settings.h" +#include +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 "<label_mac_status->setText(status); + +} diff --git a/main.cpp b/main.cpp index 177bfa0..484b407 100644 --- a/main.cpp +++ b/main.cpp @@ -1,10 +1,15 @@ -#include "mainwindow.h" -#include - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - MainWindow w; - w.show(); - return a.exec(); -} +#include "mainwindow.h" +#include +#include + +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(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp index cbbe2e5..0a47afd 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,782 +1,1169 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" -#include "dialogsettings.h" -#include -#include -// 初始化线程、状态寄存器、配置信息 -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(QString::fromLocal8Bit("成功%1").arg(write_success_count1)); - waiting_cmd1=false; - }else{ - this->write_fail_count1++; - ui->label_result_fail1->setText(QString::fromLocal8Bit("失败%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()<=0) - { - this->ui->label_runtime_status1->setText(QString::fromLocal8Bit("发现新设备")); - 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(); - } - if (waiting_cmd1 && data.indexOf(TIME_FOR_CMD)>=0) - { - uart_send_data1(ATCMD_ADD_VOTE); - } - - if (uart_rx_flag1) - {//指令下达完毕,开始接收数据 - uart_rx_buff_array1.append(data); - if (uart_rx_buff_array1.indexOf("OK~")>=0 || uart_rx_buff_array1.indexOf("power off device!")>=0) - { - 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(QString::fromLocal8Bit("关机成功\r\n"),LOG_DIRECT_IN); -} - return; - } - cmd_index_1 ++; //开始执行下一指令 - qDebug()<<"next cmdindex "<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: - { - this->uart_send_data1(ATCMD_GET_CPUID); - } - 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()<putData(data); -} -void MainWindow::readData3() -{ - const QByteArray data = serialport3->readAll(); - qDebug()<putData(data); -} -void MainWindow::readData4() -{ - const QByteArray data = serialport4->readAll(); - qDebug()<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, "请选择文件"); - 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(QString::fromLocal8Bit("阻止休眠\r\n"),LOG_DIRECT_IN); - qDebug()<<"阻止休眠"; - break; - case 1: - { - //检查当前的号是否已经是写过的号,放置重复写号造成的浪费。 - int ret = uart_rx_buff_array1.indexOf(tr("28*****")); - if (ret >= 0) - { - QString unit="281106"+uart_rx_buff_array1.mid(ret+7,6); - bool mac_used=settings::getInstance().getMacUsed(unit.toUpper()); - if (mac_used) - { - ui_display1(QString::fromLocal8Bit("手表地址")+unit+QString::fromLocal8Bit("已占用\r\n"),LOG_DIRECT_OUT); - ui_show_result1(QString::fromLocal8Bit("Mac地址已占用"),false); - cmd_index_1 = -1; - - - }else{ - ui_display1(QString::fromLocal8Bit("手表地址")+unit+QString::fromLocal8Bit(" 可用!\r\n"),LOG_DIRECT_IN); - } - - }else{ - ui_display1(QString::fromLocal8Bit("查询手表Mac失败!\r\n"),LOG_DIRECT_OUT); - cmd_index_1 = -1; - ui_show_result1(QString::fromLocal8Bit("查询手表Mac失败"),false); - } - - } - break; - case 2: - ui_display1(QString::fromLocal8Bit("执行设置地址\r\n"),LOG_DIRECT_IN); - break; - case 3: - { -// local_addr : 28*****010101 - QString unit=ui->ledit_spp_addr_1->text(); - int ret = uart_rx_buff_array1.indexOf(tr("28*****")); - if (ret >= 0) - { - QString unit_watch="281106"+uart_rx_buff_array1.mid(ret+7,6); - qDebug()<= 0 ) - { - if (uart_rx_buff_array1.size()-ret >84){ - QString cpu_id=uart_rx_buff_array1.mid(ret+9,84).replace("\r\n","").replace("0x","").replace(" ",""); - ui_display1("cpuid: "+cpu_id+"\r\n",LOG_DIRECT_IN); - ret = settings::getInstance().set_mac_used(ui->ledit_spp_addr_1->text(),cpu_id,true); - qDebug()<<"set mac used "<ledit_spp_addr_1->text()<<" "<< cpu_id<<" ret "<textBrowser_result->setText(settings::getInstance().getmacStatusFull()); - ui_display1(QString::fromLocal8Bit("设置mac成功\r\n"),LOG_DIRECT_IN); - }else{ - ui_show_result1(QString::fromLocal8Bit("获取cpuid失败\r\n"),false); - } - } - - }else{ - ui_display1(QString::fromLocal8Bit("获取cpuid失败\r\n"),LOG_DIRECT_OUT); - cmd_index_1 = -4; - ui_show_result1(QString::fromLocal8Bit("获取cpuid失败\r\n"),false); - } - } - } - break; - case 5: - { - int ret = uart_rx_buff_array1.indexOf("power off device"); - if (ret >= 0 ) - { - ui_display1(QString::fromLocal8Bit("关机成功\r\n"),LOG_DIRECT_IN); - }else{ - ui_display1(QString::fromLocal8Bit("关机失败\r\n"),LOG_DIRECT_OUT); - } - ui_show_result1(QString::fromLocal8Bit("设置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; - qDebug()<<"uart_send_data1 "<write(cmd.toUtf8()); - m_bytesToWrite1 = ret; - qDebug()<<"uart_send_data1 "<isActive()) - spp_timer_handle1->stop(); - spp_timer_handle1->start(1500); -// 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; -// ui_display1(ui->cbox_uart_com_select_1->currentText()+QString::fromLocal8Bit("AT指令指令超时!\r\n"),false); - if(G_cmd==ATCMD_ADD_VOTE) - { - this->uart_send_data1(ATCMD_ADD_VOTE); - } - else - { - ui_display1(QString::fromLocal8Bit(G_cmd.toStdString().c_str()),false); - 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(); - - serialport1->setPortName(com_name); - serialport1->setBaudRate(baud_rate.toInt()); - serialport1->setDataBits(QSerialPort::DataBits::Data8); - serialport1->setParity(QSerialPort::Parity::NoParity); - serialport1->setStopBits(QSerialPort::StopBits::OneStop); - serialport1->setFlowControl(QSerialPort::FlowControl::NoFlowControl); - - ui->txtb_dispaly->clear(); - if (serialport1->isOpen()) - { - this->cmd_index_1 = 0; -// this->uart_send_data1(ATCMD_GET_MAC); - - // - }else{ - if (serialport1->open(QIODevice::ReadWrite)) { - // serialport1->setEnabled(true); - // serialport1->setLocalEchoEnabled(false); - - 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 { - QMessageBox::critical(this, tr("Error"), serialport1->errorString()); - - ui_display1(tr("Open error\r\n"),false); - return; - } - } - - // 开始工作 - working_state_1 = true; - write_fail_count1= 0; - write_success_count1 =0; - ui->label_result_fail1->setText(QString::fromLocal8Bit("失败%1").arg(write_fail_count1)); - ui->label_result_success1->setText(QString::fromLocal8Bit("成功%1").arg(write_success_count1)); - ui->pbtn_spp_reconnect_1->setText(QString::fromLocal8Bit("停止写地址")); -ui->label_runtime_status1->setText(QString::fromLocal8Bit("等待手表开机")); - -// 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()<pbtn_spp_reconnect_1->setText(QString::fromLocal8Bit("开始写地址")); - ui->label_runtime_status1->setText(QString::fromLocal8Bit("已停止写地址...")); - working_state_1 = false; - 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 "<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(); - -} -/* ----------------------------------------------------------------------------------- */ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "dialogsettings.h" +#include +#include +// 初始化线程、状态寄存器、配置信息 +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()< 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 "<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()<putData(data); +} +void MainWindow::readData3() +{ + const QByteArray data = serialport3->readAll(); + qDebug()<putData(data); +} +void MainWindow::readData4() +{ + const QByteArray data = serialport4->readAll(); + qDebug()<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()<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 "<write(cmd.toUtf8()); + m_bytesToWrite1 = ret; + qDebug()<<"uart_send_data1 "<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()<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 "<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(); + +} + + diff --git a/mainwindow.h b/mainwindow.h index bd39ea7..609d94d 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -1,165 +1,168 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include -#include -#include -#include -#include -#include -#include "result_thread.h" -#include "QFileDialog" -#include "QMessageBox" -#include "QTime" -#include "common.h" -#include -#include -#include - -#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;//发现开机后,等待下达cmd指令 - 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 +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include "result_thread.h" +#include "QFileDialog" +#include "QMessageBox" +#include "QTime" +#include "common.h" +#include +#include +#include + +#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 diff --git a/result_thread.h b/result_thread.h index be0f8bc..4448ba9 100644 --- a/result_thread.h +++ b/result_thread.h @@ -1,42 +1,42 @@ -#ifndef RESULT_THREAD_H -#define RESULT_THREAD_H -#include "mythread.h" -#include -#include -#include -#include -#include "common.h" -#define BUF_SIZE 4096 -#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 +#ifndef RESULT_THREAD_H +#define RESULT_THREAD_H +#include "mythread.h" +#include +#include +#include +#include +#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 diff --git a/settings.cpp b/settings.cpp index 1e690fb..6ffb459 100644 --- a/settings.cpp +++ b/settings.cpp @@ -1,201 +1,201 @@ -#include "settings.h" -#include -#include -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()<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 "<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()<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(QString::fromLocal8Bit("mac地址格式错误")); - }else - { - - ret.append(mac_start_fullstr); - ret.append(QString::fromLocal8Bit("直到")); - ret.append(mac_end_fullstr).append("\n"); - ret.append( QString::fromLocal8Bit("总共") ); - ret.append(QString().setNum(mac_count)).append(QString::fromLocal8Bit("个地址")); - - } - return ret; -} -QString settings::getmacStatusFull() -{ - int used_count = sqlitemanager->get_mac_used_count(); - QString ret = getmacStatus(); - ret = ret.append(QString::fromLocal8Bit("\n已用%1")).arg(used_count); - ret = ret.append(QString::fromLocal8Bit("\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 "<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"); -} - +#include "settings.h" +#include +#include +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()<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 "<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()<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 "<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"); +} + diff --git a/settings.h b/settings.h index bc65ae4..20bc4fd 100644 --- a/settings.h +++ b/settings.h @@ -1,137 +1,145 @@ -#ifndef SETTINGS_H -#define SETTINGS_H -#include -#include -#include -#include -#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^BTADDR?\r\n" -/* -» 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~ -*/ -#define BOOT_UP_MSG "yaffs filesystem init start" -#define TIME_FOR_CMD "bt enable_bt_stack ret" -#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 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 +#ifndef SETTINGS_H +#define SETTINGS_H +#include +#include +#include +#include +#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