<<<<<<< HEAD #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif void MainWindow::mw_tableInit(void) { // 初始化组和子组的下拉框 this->ui->comboBox_icdSubGroup->addItems(this->m_APP_Icd->comboBox_subGroupInfo.value(this->ui->comboBox_icdGroup->currentIndex())); // 填充数据 for (int row = 0; row < 16; ++row) { for (int col = 0; col < 16; ++col) { // int index = row * 16 + col; // 计算一维数组索引 QTableWidgetItem *item = new QTableWidgetItem(QString::number(this->m_APP_Icd->DAC256_10bit_data[row][col])); this->ui->tableWidget_volInput->setItem(row, col, item); } } // 在窗口构造函数中连接信号:当输入数据发生变化时,自动链接 connect(this->ui->tableWidget_volInput, &QTableWidget::cellChanged, this, &MainWindow::mw_onCellChanged); } // 表格中的数据有变化时,触发该函数 void MainWindow::mw_onCellChanged(int row, int column) { uint8_t i = 0; uint8_t j = 0; QTableWidgetItem *item = this->ui->tableWidget_volInput->item(row, column); if (item) { bool ok; // 转换数据 int newValue = item->text().toInt(&ok); if(!ok || (newValue > 1023)){ /* 错误输入,设置为原来的值 */ // 设置为原来的值 QTableWidgetItem *item = new QTableWidgetItem(QString::number(this->m_APP_Icd->DAC256_10bit_data[row][column])); this->ui->tableWidget_volInput->setItem(row, column, item); // 提示警告 QMessageBox::question(this,"错误","请输入0-1023的数字!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); return; } qDebug() << "Cell at (" << row << "," << column << ") changed to:" << newValue; // 设置DAC256 10bit数组的值 if(!this->m_APP_Icd->ICD_setDAC256Data10bit(row, column, newValue)){ qDebug() << "set newvalue:" << newValue << "failed!"; return; } /* 如果是同值配置,则让页面和DAC256Data10bit数组的值赋值为同一个值*/ if(this->ui->comboBox_icdCmd->currentIndex() == 1){ for(i = 0; i < 16; i++){ for(j = 0; j < 16; j++){ // 防止多次进入该程序 if(this->ui->tableWidget_volInput->item(i, j)->text().toInt() != newValue){ // 表格中显示输入的值 this->ui->tableWidget_volInput->item(i, j)->setText(QString::number(newValue)); // 设置DAC256_10bit_data数组中的值为输入的值 this->m_APP_Icd->ICD_setDAC256Data10bit(i, j, newValue); } } } } } } void MainWindow::mw_showVersionInfo() { QMessageBox::information( this, tr("版本信息"), tr("上位机版本:%1\n").arg(VERSION) + tr("修改时间:%1\n").arg(MOD_TIME) + tr("ICD协议版本:%1\n").arg(ICD_VERSION)+ tr("作者:罗林赖生\n") ); } void MainWindow::mw_showUserManual() { QMessageBox::information( this, tr("使用说明"), tr("1. 打开设备:点击刷新设备列表,搜索串口/SPI设备,选择设备后,点击打开设备\n") + tr("2. 配置通信:配置串口/SPI通信协议相关的参数,点击初始化SPI/串口参数配置\n") + tr("3. 寄存器配置和电压配置(以下操作并非都需操作,视情况配置):\n") + tr("3.1 寄存器配置:\n") + tr("在寄存器配置以及回读区配置相关的属性后,点击寄存器配置按钮进行配置,如需查看是否配置成功,配置完后等待一秒,点击寄存器回读按钮,寄存器值将显示至文本框\n") + tr("3.2 电压配置:\n") + tr("3.2.1 命令选择:选择需要配置的方式 \n") + tr("3.2.2 分组和子分组选择:选择需要配置的分组和子分组,注:当命令选择异值配置时,分组只能选择单个DAC! \n") + tr("3.2.3 输入电压:在16X16的表格内输入所需要配置的电压对应的数字量,范围为0-1023,通道数按照从左到右,从上到下依次排布,注:当命令选择同值配置时,只需输入一个电压值,按回车后自动填充所有的数据 \n")+ tr("3.2.4 设置电压:点击发送电压命令按钮,将把电压相关数据发送至下位机,此时日志输出窗口将输出相关日志信息 \n") ); } // 菜单栏初始化 void MainWindow::mw_menuBarInit(void) { // 获取主窗口的菜单栏 QMenuBar *menuBar = this->menuBar(); // 1. 添加"主菜单"菜单 QMenu *mainMenu = menuBar->addMenu(tr("菜单(&M)")); // &H 表示快捷键 Alt+H // 2. 添加"帮助"菜单(包含"版本信息"和"使用说明") QMenu *helpMenu = menuBar->addMenu(tr("帮助(&H)")); // &H 表示快捷键 Alt+H // 1.1 添加"版本信息"动作 QAction *versionAction = new QAction(tr("版本信息(&V)"), this); helpMenu->addAction(versionAction); connect(versionAction, &QAction::triggered, this, &MainWindow::mw_showVersionInfo); // 1.2 添加"使用说明"动作 QAction *manualAction = new QAction(tr("使用说明(&M)"), this); helpMenu->addAction(manualAction); connect(manualAction, &QAction::triggered, this, &MainWindow::mw_showUserManual); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 设置程序标题 this->setWindowTitle(QString(tr("SP713控制软件 使用说明打开帮助->使用说明")).arg(VERSION).arg(MOD_TIME)); // // 初始化日志处理器并绑定UI LogHandler::log_init(ui->plainTextEdit_logOutput); // 连接日志信号到UI更新 connect(LogHandler::log_instance(), &LogHandler::log_messageLogged, ui->plainTextEdit_logOutput, &QPlainTextEdit::appendPlainText, Qt::QueuedConnection); // 确保跨线程安全 // 例化DRV_Spi对象 this->m_DRV_Spi = new DRV_Spi(this); // 查找Spi设备 this->mw_findSpiDev(); // 例化APP_ICD类 this->m_APP_Icd = new APP_Icd(this); // 初始化 this->m_APP_Icd->ICD_init(); // 表格初始化:一定要在APP_ICD类初始化后!!!! this->mw_tableInit(); // 初始化寄存器配置中DAC通道值 for(int i = 0; i <= 256; i++) { this->ui->comboBox_icdDacCh->addItem(QString::number(i)); } // 菜单栏初始化 this->mw_menuBarInit(); // 查找串口设备 this->ui->pushButton_uartRefreshDev->click(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::mw_findSpiDev(void) { // 清空设备列表 this->ui->comboBox_spiDevList->clear(); // 枚举Spi设备 if(this->m_DRV_Spi->spi_enumDevice()){ this->ui->comboBox_spiDevList->addItem(this->m_DRV_Spi->m_DRV_Spi_Infors.bDeviceName); }else{ //QMessageBox::question(NULL,"警告","未发现设备",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // void MainWindow::mw_findSpiDev(void) // { // // 清除相关的变量 // this->devices.clear(); // this->ui->comboBox_spiDevList->clear(); // // 获取 CH347 设备列表 // try { // auto devList = this->spiApi.initUsbDevice(); // this->devices = QVector::fromStdVector(devList); // } catch (const std::exception &e) { // DbgPrint("init USB device failed!"); // } // if (devices.isEmpty()) { // DbgPrint("not find CH347 device!"); // } // /***********************输出设备信息****************************/ // if(devices.length() != 0) { // DbgPrint("Find %d CH347 devices!", devices.length()); // for(int i = 0; i < devices.length(); i++){ // DbgPrint("Manufacturer:%s Product:%s.", devices[i].ManufacturerString, devices[i].ProductString); // this->ui->comboBox_spiDevList->addItem(devices[i].ProductString); // } // } // } // void MainWindow::mw_sendTestData(void) // { // /***********************配置参数(示例:设置 DAC 组的异值电压)****************************/ // SetCommandArg cmdArg; // cmdArg.cmd_ = SetCommandArg::SP_CMD_DIF_VALUE; // cmdArg.group_ = SetCommandArg::DAC; // cmdArg.childGroup_ = 1; // 操作编号为 1 的 DAC // SetVotegeArg voltageArg; // for (int i = 0; i < 256; ++i) { // // voltageArg.votes_.push_back(i); // 填充 256 个电压值(0-255) // voltageArg.votes_.push_back(1); // 填充 256 个电压值(0-255) // } // this->spiApi.debug(); // // 下发参数到第一个设备 // bool success = spiApi.applyArg(devices[0], cmdArg, voltageArg); // if (success) { // DbgPrint("Parameters applied successfully!"); // } else { // DbgPrint("Failed to apply parameters!"); // } // } // 刷新设备回调函数 void MainWindow::on_pushButton_refreshDev_clicked() { // 查找Spi设备 this->mw_findSpiDev(); } // 关闭设备回调函数 void MainWindow::on_pushButton_closeDev_clicked() { // // 关闭设备 // if(!this->m_DRV_Spi->spi_closeDevice()){ // // QMessageBox::question(NULL,"错误","关闭设备失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); // } // this->mw_sendTestData(); } // 打开设备回调函数 void MainWindow::on_pushButton_openDev_clicked() { // // 打开设备 // if(!this->m_DRV_Spi->spi_openDevice(this->ui->comboBox_spiDevList->currentIndex())){ // // QMessageBox::question(NULL,"错误","打开设备失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); // } } // 查找串口设备 void MainWindow::on_pushButton_uartRefreshDev_clicked() { // 清空comboBox_uartDevList if(this->ui->comboBox_uartDevList->count()) this->ui->comboBox_uartDevList->clear(); // 刷新UART设备 if(this->m_APP_Icd->m_uartDriver->Uart_enumDevice()){ // 将串口设备的名称添加至列表中 for(int i = 0; i < this->m_APP_Icd->m_uartDriver->m_DRV_Uart_Infors.ulDevCnt; i++) this->ui->comboBox_uartDevList->addItem(this->m_APP_Icd->m_uartDriver->m_DRV_Uart_Infors.bDeviceName[i]); }else{ QMessageBox::question(this,"提示","没有发现串口设备!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // 打开串口设备 void MainWindow::on_pushButton_uartOpenDev_clicked() { // 读取当前的设备索引号 ULONG index = this->ui->comboBox_uartDevList->currentIndex(); // 调用串口打开函数 BOOL status = this->m_APP_Icd->m_uartDriver->Uart_openDevice(index); // 判断打开串口设备是否成功 if(status == TRUE){ // 打开成功. 则关闭或开启一些组件 this->ui->comboBox_uartDevList->setDisabled(true); this->ui->pushButton_uartCloseDev->setEnabled(true); this->ui->pushButton_uartOpenDev->setDisabled(true); this->ui->pushButton_uartSetPara->setEnabled(true); // 新建数据记录日志txt文件 if(!this->m_APP_Icd->ICD_newDataRecordingFile()){ QMessageBox::question(this,"错误","新建通信记录文件失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } // 配置默认的串口配置 this->ui->pushButton_uartSetPara->click(); } } // 关闭串口函数 void MainWindow::on_pushButton_uartCloseDev_clicked() { // 调用串口关闭函数 BOOL status = this->m_APP_Icd->m_uartDriver->Uart_closeDevice(); // 判断打开串口设备是否成功 if(status == TRUE){ // 打开成功. 则关闭或开启一些组件 this->ui->comboBox_uartDevList->setEnabled(true); this->ui->pushButton_uartCloseDev->setDisabled(true); this->ui->pushButton_uartOpenDev->setEnabled(true); this->ui->pushButton_uartSetPara->setDisabled(true); } } // 串口设置参数函数 void MainWindow::on_pushButton_uartSetPara_clicked() { // 读取组件中配置参数的值 ULONG Baudrate = this->ui->comboBox_uartBps->currentText().toUInt(); UCHAR StopBits = this->ui->comboBox_uartStop->currentIndex(); UCHAR Parity = this->ui->comboBox_uartVerify->currentIndex(); UCHAR DataSize = this->ui->comboBox_uartData->currentText().toUInt(); UCHAR Timeout = this->ui->lineEdit_uartTimeOut->text().toUInt(); // 调用配置参数函数进行配置 if(this->m_APP_Icd->m_uartDriver->Uart_setPara(Baudrate, StopBits, Parity, DataSize, Timeout) == FALSE){ QMessageBox::question(this,"错误","设置串口参数失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // 当分组的序号发生变化时 void MainWindow::on_comboBox_icdGroup_currentIndexChanged(int index) { // 清除子分组的列表 this->ui->comboBox_icdSubGroup->clear(); // 设置子分组对应的列表 this->ui->comboBox_icdSubGroup->addItems(this->m_APP_Icd->comboBox_subGroupInfo.value(index)); } // 发送设置电压相关命令 void MainWindow::on_pushButton_icdSendVolCMD_clicked() { // 获取页面的命令、分组、子分组 uint8_t CMD = this->ui->comboBox_icdCmd->currentIndex() + 1; uint8_t group = this->ui->comboBox_icdGroup->currentIndex(); if(group == 0) group = 0xAA; uint8_t subGroup = this->ui->comboBox_icdSubGroup->currentIndex(); if((subGroup == 0) && (group == 0xAA)) subGroup = 0xAA; else subGroup += 1; // 调用设置电压命令编码函数 this->m_APP_Icd->ICD_volCMDProtoEncode(CMD, group, subGroup); } // 写寄存器配置指令 void MainWindow::on_pushButton_icdRegConfig_clicked() { // 读取dac的编号值 uint8_t dacID = this->ui->comboBox_icdDacId->currentIndex()+1; // 读取dac通道值 uint16_t dacCH = this->ui->comboBox_icdDacCh->currentIndex(); // 判断是否为第256通道 if(dacCH == 256){ dacCH = 0; dacID += 128; } // 读取funcEN值,将各个选项的使能值按照协议的报文格式叠加到funcEN数据中 uint8_t funcEN = 0x00; if(this->ui->checkBox_icdEN_TADC->isChecked()){ funcEN += 1; } if(this->ui->checkBox_icdFBK_EN->isChecked()){ funcEN += 2; } if(this->ui->checkBox_icdTEMPTEST->isChecked()){ funcEN += 4; } if(this->ui->checkBox_icdTEST_EN->isChecked()){ funcEN += 8; } if(this->ui->checkBox_icdTRIG_TADC->isChecked()){ funcEN += 16; } // 读取adcCurrConfig值 uint8_t adcCurrConfig = this->ui->comboBox_icdRefCurr->currentIndex(); adcCurrConfig = adcCurrConfig*16 + this->ui->comboBox_icdADCClkPrs->currentIndex(); // 调用写寄存器编码函数 if(!this->m_APP_Icd->ICD_regWCMDProtoEncode(dacID, dacCH, funcEN, adcCurrConfig)){ QMessageBox::question(this,"错误","设置寄存器失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // 寄存器回读命令 void MainWindow::on_pushButton_icdRegRead_clicked() { // 清楚 this->revData.clear(); // 读取dac的编号值 uint8_t dacID = this->ui->comboBox_icdDacId->currentIndex()+1; // 读取寄存器的值 if(!this->m_APP_Icd->ICD_regRCMDProtoEncode(dacID)){ QMessageBox::question(this,"错误","回读寄存器失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } // 读取串口接收区的数据 QThread::msleep(50); // 延时10毫秒 if(!this->m_APP_Icd->m_uartDriver->Uart_Read(this->revData)){ QMessageBox::question(this,"错误","串口返回数据失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } // 将返回的寄存器值显示到label界面 this->ui->label_icdRegRead->setText(this->revData.toHex(' ')); // 用空格分隔每个字节 // 记录读的数据 this->m_APP_Icd->ICD_addContextToDataRecordingFile(false, this->revData); // 解析数据 this->regParsedData = this->m_APP_Icd->ICD_parseRegisterData(this->revData); qDebug() << "CH_TEST:" << this->regParsedData.CH_TEST \ << ",EN_TADC:" << this->regParsedData.EN_TADC \ << ",FBK_EN:" << this->regParsedData.FBK_EN \ << ",TEMPTEST_EN:" << this->regParsedData.TEMPTEST_EN \ << ",TEST_EN:" << this->regParsedData.TEST_TADC \ << ",TRIG_TADC:" << this->regParsedData.TRIG_TADC \ << ",N_CLKDIV18:" << QString::number(this->regParsedData.N_CLKDIV18, 2).rightJustified(2, '0') \ << ",ICON18:" << QString::number(this->regParsedData.ICON18, 2).rightJustified(4, '0') \ << ",VCON:" << QString::number(this->regParsedData.VCON, 2).rightJustified(2, '0') \ << ",EOC:" << this->regParsedData.EOC \ << ",ADC_OUT:" << this->regParsedData.ADC_OUT \ << ",D_FB:" << this->regParsedData.D_FB; // 添加记录至txt文件 this->m_APP_Icd->ICD_addContextToVolRecordingFile(this->regParsedData.EOC, this->regParsedData.CH_TEST, this->regParsedData.ADC_OUT); } // 一键回读当前电压值 void MainWindow::on_pushButton_icdReadCurrVol_clicked() { uint16_t ch_index = 1; // 新建回读电压txt文件 if(!this->m_APP_Icd->ICD_newVolRecordingFile(this->ui->comboBox_icdDacId->currentIndex()+1)){ QMessageBox::question(this,"错误","新建回读电压记录文件失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } // 设置寄存器的DAC编号为当前设置电压的DAC编号 // this->ui->comboBox_icdDacId->setCurrentIndex(); // 从1至256通道依次读取电压值 for(ch_index = 1; ch_index <= 256; ch_index++) { // 设置配置项 this->ui->comboBox_icdDacCh->setCurrentIndex(0); // 设置通道值为全0 this->ui->checkBox_icdTRIG_TADC->setCheckState(Qt::Unchecked); // 关闭TADC this->ui->pushButton_icdRegConfig->click(); // 触发配置寄存器按钮 QThread::msleep(50); // 延时50毫秒 this->ui->checkBox_icdTRIG_TADC->setCheckState(Qt::Checked); // 开启TADC this->ui->comboBox_icdDacCh->setCurrentIndex(ch_index); //设置当前通道 this->ui->pushButton_icdRegConfig->click(); // 触发配置寄存器按钮 QThread::msleep(50); // 延时50毫秒 this->ui->pushButton_icdRegConfig->click(); // 再次触发配置寄存器按钮 QThread::msleep(50); // 延时50毫秒 this->ui->pushButton_icdRegRead->click(); // 读取寄存器值 QThread::msleep(50); // 延时50毫秒 } // 清空电压记录文件的名称 this->m_APP_Icd->volRecordingFile.clear(); this->ui->comboBox_icdDacCh->setCurrentIndex(0); // 设置通道值为全0 this->ui->checkBox_icdTRIG_TADC->setCheckState(Qt::Unchecked); // 关闭TADC this->ui->pushButton_icdRegConfig->click(); // 触发配置寄存器按钮 QThread::msleep(50); // 延时50毫秒 QMessageBox::question(this,"成功","成功读取该DAC下的所有的电压值!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } ======= #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif void MainWindow::mw_tableInit(void) { // 初始化组和子组的下拉框 this->ui->comboBox_icdSubGroup->addItems(this->m_APP_Icd->comboBox_subGroupInfo.value(this->ui->comboBox_icdGroup->currentIndex())); // 填充数据 for (int row = 0; row < 16; ++row) { for (int col = 0; col < 16; ++col) { // int index = row * 16 + col; // 计算一维数组索引 QTableWidgetItem *item = new QTableWidgetItem(QString::number(this->m_APP_Icd->DAC256_10bit_data[row][col])); this->ui->tableWidget_volInput->setItem(row, col, item); } } // 在窗口构造函数中连接信号:当输入数据发生变化时,自动链接 connect(this->ui->tableWidget_volInput, &QTableWidget::cellChanged, this, &MainWindow::mw_onCellChanged); } // 表格中的数据有变化时,触发该函数 void MainWindow::mw_onCellChanged(int row, int column) { uint8_t i = 0; uint8_t j = 0; QTableWidgetItem *item = this->ui->tableWidget_volInput->item(row, column); if (item) { bool ok; // 转换数据 int newValue = item->text().toInt(&ok); if(!ok || (newValue > 1023)){ /* 错误输入,设置为原来的值 */ // 设置为原来的值 QTableWidgetItem *item = new QTableWidgetItem(QString::number(this->m_APP_Icd->DAC256_10bit_data[row][column])); this->ui->tableWidget_volInput->setItem(row, column, item); // 提示警告 QMessageBox::question(this,"ERROR","plase input 0-1023 digit!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); return; } qDebug() << "Cell at (" << row << "," << column << ") changed to:" << newValue; // 设置DAC256 10bit数组的值 if(!this->m_APP_Icd->ICD_setDAC256Data10bit(row, column, newValue)){ qDebug() << "set newvalue:" << newValue << "failed!"; return; } /* 如果是同值配置,则让页面和DAC256Data10bit数组的值赋值为同一个值*/ if(this->ui->comboBox_icdCmd->currentIndex() == 1){ for(i = 0; i < 16; i++){ for(j = 0; j < 16; j++){ // 防止多次进入该程序 if(this->ui->tableWidget_volInput->item(i, j)->text().toInt() != newValue){ // 表格中显示输入的值 this->ui->tableWidget_volInput->item(i, j)->setText(QString::number(newValue)); // 设置DAC256_10bit_data数组中的值为输入的值 this->m_APP_Icd->ICD_setDAC256Data10bit(i, j, newValue); } } } } } } void MainWindow::mw_showVersionInfo() { QMessageBox::information( this, tr("版本信息"), tr("上位机版本:%1\n").arg(VERSION) + tr("修改时间:%1\n").arg(MOD_TIME) + tr("ICD协议版本:%1\n").arg(ICD_VERSION)+ tr("作者:罗林赖生\n") ); } void MainWindow::mw_showUserManual() { QMessageBox::information( this, tr("使用说明"), tr("1. 打开设备:点击刷新设备列表,搜索串口/SPI设备,选择设备后,点击打开设备\n") + tr("2. 配置通信:配置串口/SPI通信协议相关的参数,点击初始化SPI/串口参数配置\n") + tr("3. 寄存器配置和电压配置(以下操作并非都需操作,视情况配置):\n") + tr("3.1 寄存器配置:\n") + tr("在寄存器配置以及回读区配置相关的属性后,点击寄存器配置按钮进行配置,如需查看是否配置成功,配置完后等待一秒,点击寄存器回读按钮,寄存器值将显示至文本框\n") + tr("3.2 电压配置:\n") + tr("3.2.1 命令选择:选择需要配置的方式 \n") + tr("3.2.2 分组和子分组选择:选择需要配置的分组和子分组,注:当命令选择异值配置时,分组只能选择单个DAC! \n") + tr("3.2.3 输入电压:在16X16的表格内输入所需要配置的电压对应的数字量,范围为0-1023,通道数按照从左到右,从上到下依次排布,注:当命令选择同值配置时,只需输入一个电压值,按回车后自动填充所有的数据 \n")+ tr("3.2.4 设置电压:点击发送电压命令按钮,将把电压相关数据发送至下位机,此时日志输出窗口将输出相关日志信息 \n") ); } // 菜单栏初始化 void MainWindow::mw_menuBarInit(void) { // 获取主窗口的菜单栏 QMenuBar *menuBar = this->menuBar(); // 1. 添加"主菜单"菜单 QMenu *mainMenu = menuBar->addMenu(tr("菜单(&M)")); // &H 表示快捷键 Alt+H // 2. 添加"帮助"菜单(包含"版本信息"和"使用说明") QMenu *helpMenu = menuBar->addMenu(tr("帮助(&H)")); // &H 表示快捷键 Alt+H // 1.1 添加"版本信息"动作 QAction *versionAction = new QAction(tr("版本信息(&V)"), this); helpMenu->addAction(versionAction); connect(versionAction, &QAction::triggered, this, &MainWindow::mw_showVersionInfo); // 1.2 添加"使用说明"动作 QAction *manualAction = new QAction(tr("使用说明(&M)"), this); helpMenu->addAction(manualAction); connect(manualAction, &QAction::triggered, this, &MainWindow::mw_showUserManual); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 设置程序标题 this->setWindowTitle(QString(tr("SP713控制软件 使用说明打开帮助->使用说明")).arg(VERSION).arg(MOD_TIME)); // // 初始化日志处理器并绑定UI LogHandler::log_init(ui->plainTextEdit_logOutput); // 连接日志信号到UI更新 connect(LogHandler::log_instance(), &LogHandler::log_messageLogged, ui->plainTextEdit_logOutput, &QPlainTextEdit::appendPlainText, Qt::QueuedConnection); // 确保跨线程安全 // // // 例化DRV_Spi对象 // this->m_DRV_Spi = new DRV_Spi(this); // // // 查找Spi设备 // this->mw_findSpiDev(); // 例化APP_ICD类 this->m_APP_Icd = new APP_Icd(this); // 初始化 this->m_APP_Icd->ICD_init(); // 表格初始化:一定要在APP_ICD类初始化后!!!! this->mw_tableInit(); // 初始化寄存器配置中DAC通道值 for(int i = 1; i <= 256; i++) { this->ui->comboBox_icdDacCh->addItem(QString::number(i)); } // 菜单栏初始化 this->mw_menuBarInit(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::mw_findSpiDev(void) { // 清空设备列表 this->ui->comboBox_spiDevList->clear(); // 枚举Spi设备 if(this->m_DRV_Spi->spi_enumDevice()){ this->ui->comboBox_spiDevList->addItem(this->m_DRV_Spi->m_DRV_Spi_Infors.bDeviceName); }else{ //QMessageBox::question(NULL,"警告","未发现设备",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // void MainWindow::mw_findSpiDev(void) // { // // 清除相关的变量 // this->devices.clear(); // this->ui->comboBox_spiDevList->clear(); // // 获取 CH347 设备列表 // try { // auto devList = this->spiApi.initUsbDevice(); // this->devices = QVector::fromStdVector(devList); // } catch (const std::exception &e) { // DbgPrint("init USB device failed!"); // } // if (devices.isEmpty()) { // DbgPrint("not find CH347 device!"); // } // /***********************输出设备信息****************************/ // if(devices.length() != 0) { // DbgPrint("Find %d CH347 devices!", devices.length()); // for(int i = 0; i < devices.length(); i++){ // DbgPrint("Manufacturer:%s Product:%s.", devices[i].ManufacturerString, devices[i].ProductString); // this->ui->comboBox_spiDevList->addItem(devices[i].ProductString); // } // } // } // void MainWindow::mw_sendTestData(void) // { // /***********************配置参数(示例:设置 DAC 组的异值电压)****************************/ // SetCommandArg cmdArg; // cmdArg.cmd_ = SetCommandArg::SP_CMD_DIF_VALUE; // cmdArg.group_ = SetCommandArg::DAC; // cmdArg.childGroup_ = 1; // 操作编号为 1 的 DAC // SetVotegeArg voltageArg; // for (int i = 0; i < 256; ++i) { // // voltageArg.votes_.push_back(i); // 填充 256 个电压值(0-255) // voltageArg.votes_.push_back(1); // 填充 256 个电压值(0-255) // } // this->spiApi.debug(); // // 下发参数到第一个设备 // bool success = spiApi.applyArg(devices[0], cmdArg, voltageArg); // if (success) { // DbgPrint("Parameters applied successfully!"); // } else { // DbgPrint("Failed to apply parameters!"); // } // } // 刷新设备回调函数 void MainWindow::on_pushButton_refreshDev_clicked() { // 查找Spi设备 this->mw_findSpiDev(); } // 关闭设备回调函数 void MainWindow::on_pushButton_closeDev_clicked() { // // 关闭设备 // if(!this->m_DRV_Spi->spi_closeDevice()){ // // QMessageBox::question(NULL,"错误","关闭设备失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); // } // this->mw_sendTestData(); } // 打开设备回调函数 void MainWindow::on_pushButton_openDev_clicked() { // // 打开设备 // if(!this->m_DRV_Spi->spi_openDevice(this->ui->comboBox_spiDevList->currentIndex())){ // // QMessageBox::question(NULL,"错误","打开设备失败!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); // } } // 查找串口设备 void MainWindow::on_pushButton_uartRefreshDev_clicked() { // 清空comboBox_uartDevList if(this->ui->comboBox_uartDevList->count()) this->ui->comboBox_uartDevList->clear(); // 刷新UART设备 if(this->m_APP_Icd->m_uartDriver->Uart_enumDevice()){ // 将串口设备的名称添加至列表中 for(int i = 0; i < this->m_APP_Icd->m_uartDriver->m_DRV_Uart_Infors.ulDevCnt; i++) this->ui->comboBox_uartDevList->addItem(this->m_APP_Icd->m_uartDriver->m_DRV_Uart_Infors.bDeviceName[i]); }else{ QMessageBox::question(this,"ERROR","not find uart device!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // 打开串口设备 void MainWindow::on_pushButton_uartOpenDev_clicked() { // 读取当前的设备索引号 ULONG index = this->ui->comboBox_uartDevList->currentIndex(); // 调用串口打开函数 BOOL status = this->m_APP_Icd->m_uartDriver->Uart_openDevice(index); // 判断打开串口设备是否成功 if(status == TRUE){ // 打开成功. 则关闭或开启一些组件 this->ui->comboBox_uartDevList->setDisabled(true); this->ui->pushButton_uartCloseDev->setEnabled(true); this->ui->pushButton_uartOpenDev->setDisabled(true); this->ui->pushButton_uartSetPara->setEnabled(true); // 新建数据记录日志txt文件 if(!this->m_APP_Icd->ICD_newDataRecordingFile()){ QMessageBox::question(this,"ERROR","new Data Recording File failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } } // 关闭串口函数 void MainWindow::on_pushButton_uartCloseDev_clicked() { // 调用串口关闭函数 BOOL status = this->m_APP_Icd->m_uartDriver->Uart_closeDevice(); // 判断打开串口设备是否成功 if(status == TRUE){ // 打开成功. 则关闭或开启一些组件 this->ui->comboBox_uartDevList->setEnabled(true); this->ui->pushButton_uartCloseDev->setDisabled(true); this->ui->pushButton_uartOpenDev->setEnabled(true); this->ui->pushButton_uartSetPara->setDisabled(true); } } // 串口设置参数函数 void MainWindow::on_pushButton_uartSetPara_clicked() { // 读取组件中配置参数的值 ULONG Baudrate = this->ui->comboBox_uartBps->currentText().toUInt(); UCHAR StopBits = this->ui->comboBox_uartStop->currentIndex(); UCHAR Parity = this->ui->comboBox_uartVerify->currentIndex(); UCHAR DataSize = this->ui->comboBox_uartData->currentText().toUInt(); UCHAR Timeout = this->ui->lineEdit_uartTimeOut->text().toUInt(); // 调用配置参数函数进行配置 if(this->m_APP_Icd->m_uartDriver->Uart_setPara(Baudrate, StopBits, Parity, DataSize, Timeout) == FALSE){ QMessageBox::question(this,"ERROR","set uart para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // 当分组的序号发生变化时 void MainWindow::on_comboBox_icdGroup_currentIndexChanged(int index) { // 清除子分组的列表 this->ui->comboBox_icdSubGroup->clear(); // 设置子分组对应的列表 this->ui->comboBox_icdSubGroup->addItems(this->m_APP_Icd->comboBox_subGroupInfo.value(index)); } // 发送设置电压相关命令 void MainWindow::on_pushButton_icdSendVolCMD_clicked() { // 获取页面的命令、分组、子分组 uint8_t CMD = this->ui->comboBox_icdCmd->currentIndex() + 1; uint8_t group = this->ui->comboBox_icdGroup->currentIndex(); if(group == 0) group = 0xAA; uint8_t subGroup = this->ui->comboBox_icdSubGroup->currentIndex(); if((subGroup == 0) && (group == 0xAA)) subGroup = 0xAA; else subGroup += 1; // 调用设置电压命令编码函数 this->m_APP_Icd->ICD_volCMDProtoEncode(CMD, group, subGroup); } // 写寄存器配置指令 void MainWindow::on_pushButton_icdRegConfig_clicked() { // 读取dac的编号值 uint8_t dacID = this->ui->comboBox_icdDacId->currentIndex()+1; // 读取dac通道值 uint16_t dacCH = this->ui->comboBox_icdDacCh->currentIndex()+1; // 判断是否为第256通道 if(dacCH == 256){ dacCH = 0; dacID += 128; } // 读取funcEN值,将各个选项的使能值按照协议的报文格式叠加到funcEN数据中 uint8_t funcEN = 0x00; if(this->ui->checkBox_icdEN_TADC->isChecked()){ funcEN += 1; } if(this->ui->checkBox_icdFBK_EN->isChecked()){ funcEN += 2; } if(this->ui->checkBox_icdTEMPTEST->isChecked()){ funcEN += 4; } if(this->ui->checkBox_icdTEST_EN->isChecked()){ funcEN += 8; } if(this->ui->checkBox_icdTRIG_TADC->isChecked()){ funcEN += 16; } // 读取adcCurrConfig值 uint8_t adcCurrConfig = this->ui->comboBox_icdRefCurr->currentIndex(); adcCurrConfig = adcCurrConfig*16 + this->ui->comboBox_icdADCClkPrs->currentIndex(); // 调用写寄存器编码函数 if(!this->m_APP_Icd->ICD_regWCMDProtoEncode(dacID, dacCH, funcEN, adcCurrConfig)){ QMessageBox::question(this,"ERROR","set reg para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } } // 寄存器回读命令 void MainWindow::on_pushButton_icdRegRead_clicked() { // 清楚 this->revData.clear(); // 读取dac的编号值 uint8_t dacID = this->ui->comboBox_icdDacId->currentIndex()+1; // 读取寄存器的值 if(!this->m_APP_Icd->ICD_regRCMDProtoEncode(dacID)){ QMessageBox::question(this,"ERROR","write read reg para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } // 读取串口接收区的数据 QThread::msleep(10); // 延时10毫秒 if(!this->m_APP_Icd->m_uartDriver->Uart_Read(this->revData)){ QMessageBox::question(this,"ERROR","read reg para failed!",QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes); } // 将返回的寄存器值显示到label界面 this->ui->label_icdRegRead->setText(this->revData.toHex(' ')); // 用空格分隔每个字节 // 记录读的数据 // this->m_APP_Icd->ICD_addContextToDataRecordingFile(false, this->revData); // 解析数据 this->regParsedData = this->m_APP_Icd->ICD_parseRegisterData(this->revData); qDebug() << "CH_TEST:" << this->regParsedData.CH_TEST \ << ",EN_TADC:" << this->regParsedData.EN_TADC \ << ",FBK_EN:" << this->regParsedData.FBK_EN \ << ",TEMPTEST_EN:" << this->regParsedData.TEMPTEST_EN \ << ",TEST_TADC:" << this->regParsedData.TEST_TADC \ << ",TRIG_TADC:" << this->regParsedData.TRIG_TADC \ << ",N_CLKDIV18:" << QString::number(this->regParsedData.N_CLKDIV18, 2).rightJustified(2, '0') \ << ",ICON18:" << QString::number(this->regParsedData.ICON18, 2).rightJustified(4, '0') \ << ",VCON:" << QString::number(this->regParsedData.VCON, 2).rightJustified(2, '0') \ << ",EOC:" << this->regParsedData.EOC \ << ",ADC_OUT:" << this->regParsedData.ADC_OUT \ << ",D_FB:" << this->regParsedData.D_FB; } >>>>>>> 799590bc1dd9b9faee90d554f54d6ad46e8b8ddd