mainwidget.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. #include "mainwidget.h"
  2. #include "ui_mainwidget.h"
  3. #include "Data_Ctrl.h"
  4. MainWidget::MainWidget(QWidget *parent)
  5. : QWidget(parent)
  6. , ui(new Ui::MainWidget)
  7. {
  8. ui->setupUi(this);
  9. ui->serialCB_3->clear();
  10. m_USBCtrl.SerialPortInit();
  11. connect(Data_Ctrl::getData()->serialPort,SIGNAL(readyRead()),this,SLOT(manual_serialPortReadyRead()));/*手动连接槽函数*/
  12. InitUI();
  13. InitConnect();
  14. //QString currentPath = QDir::currentPath();
  15. m_TotalCHNum=14;
  16. for (int i=0;i<64;i++) {
  17. m_PDUCHInfo[i].CHNum=i+1;
  18. m_PDUCHInfo[i].CHName=QString("CH%1").arg(i+1);
  19. m_chWidget[i].chid=i+1;
  20. }
  21. m_DevFile="";//"/dev/bus/usb/001/003";
  22. _timer_update_info = new QTimer(this);
  23. _timer_update_info->setInterval(1000);
  24. connect(_timer_update_info, SIGNAL(timeout()), this, SLOT(UpdateStatusInfo()));
  25. connect(_timer_update_info, SIGNAL(timeout()), this, SLOT(on_Button_checkserial_clicked()));
  26. connect(_timer_update_info, SIGNAL(timeout()), this, SLOT(on_Button_openserial_clicked()));
  27. //on_Button_checkserial_clicked();
  28. //on_Button_openserial_clicked();
  29. _timer_update_info->start();
  30. QTimer* timSend = new QTimer(this);
  31. timSend->setInterval(1000);// 设置默认定时时长1000ms
  32. // 定时查询PDU状态
  33. m_SerialInfo=new SerialInfo();
  34. QObject::connect(m_SerialInfo, &SerialInfo::addPDUInfo,this, &MainWidget::on_add_PDUStatus,Qt::QueuedConnection);
  35. QThread* pduthread = new QThread;
  36. m_SerialInfo->moveToThread(pduthread);
  37. QObject::connect(pduthread, &QThread::started, m_SerialInfo, &SerialInfo::on_startWork);
  38. QObject::connect(pduthread, &QThread::finished, m_SerialInfo, &SerialInfo::on_closeWork);
  39. pduthread->start();
  40. }
  41. MainWidget::~MainWidget()
  42. {
  43. delete ui;
  44. }
  45. void MainWidget::InitUI()
  46. {
  47. // 发送、接收计数清零
  48. sendNum = 0;
  49. recvNum = 0;
  50. // 状态栏的收、发计数标签
  51. lblSendNum = new QLabel(this);
  52. lblRecvNum = new QLabel(this);
  53. lblPortState = new QLabel(this);
  54. lblPortState->setText("Connected");
  55. //设置串口状态标签为绿色 表示已连接状态
  56. lblPortState->setStyleSheet("color:red");
  57. // 设置标签最小大小
  58. lblSendNum->setMinimumSize(100, 20);
  59. lblRecvNum->setMinimumSize(100, 20);
  60. lblPortState->setMinimumSize(550, 20);
  61. setNumOnLabel(lblSendNum, "S: ", sendNum);
  62. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  63. // 从右往左依次添加
  64. ui->horizontalLayout_15->addWidget(lblPortState);
  65. ui->horizontalLayout_15->addWidget(lblSendNum);
  66. ui->horizontalLayout_15->addWidget(lblRecvNum);
  67. ui->pb_Debug->setIcon(QIcon(":/resource/Serial.png"));
  68. ui->label_INT->setStyleSheet("color: rgb(0, 218, 205);");
  69. ui->label_26->setStyleSheet("color: rgb(0, 218, 205);");
  70. ui->label_OUTT->setStyleSheet("color: orange;");
  71. ui->label_29->setStyleSheet("color: orange;");
  72. // 创建一个 QWidget,并添加一些内容
  73. ui->gridLayout->setContentsMargins(1, 1, 1, 1);
  74. ui->gridLayout->setHorizontalSpacing(20);
  75. ui->gridLayout->setVerticalSpacing(8);
  76. m_TotalCHNum=14;
  77. for (int i=0;i<m_TotalCHNum;i++) {
  78. ui->gridLayout->addWidget(&m_chWidget[i], i%((m_TotalCHNum+1)/2), i/((m_TotalCHNum+1)/2));
  79. }
  80. QString styleSheet = "QWidget { background-color: #rgb(11, 17, 45); }";
  81. //ui->MainWidget->setStyleSheet(styleSheet);
  82. }
  83. void MainWidget::InitConnect()
  84. {
  85. connect(ui->pb_Debug,SIGNAL(clicked()),this,SLOT(slot_changeDebugMode()));
  86. connect(ui->Button_checkserial_3,SIGNAL(clicked()),this,SLOT(on_Button_checkserial_clicked()));
  87. connect(ui->Button_openserial_3,SIGNAL(clicked()),this,SLOT(on_Button_openserial_clicked()));
  88. connect(ui->Button_clearrecive_3,SIGNAL(clicked()),this,SLOT(on_Button_clearrecive_clicked()));
  89. connect(ui->Button_tx_4,SIGNAL(clicked()),this,SLOT(on_Button_tx_clicked()));
  90. connect(ui->Button_cleartx_4,SIGNAL(clicked()),this,SLOT(on_Button_cleartx_clicked()));
  91. }
  92. void MainWidget::manual_serialPortReadyRead()
  93. {
  94. QByteArray recBuf = Data_Ctrl::getData()->serialPort->readAll();;
  95. QString str_rev;
  96. // 接收字节计数
  97. recvNum += recBuf.size();
  98. // 状态栏显示计数值
  99. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  100. if(ui->check_hex_recive_3->checkState() == false){
  101. if(ui->check_timestamp_3->checkState() == Qt::Checked){
  102. QDateTime nowtime = QDateTime::currentDateTime();
  103. str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
  104. str_rev += QString(recBuf).append("\r\n");
  105. }
  106. else{
  107. // 在当前位置插入文本,不会发生换行。如果没有移动光标到文件结尾,会导致文件超出当前界面显示范围,界面也不会向下滚动。
  108. //ui->recvEdit->appendPlainText(buf);
  109. if(ui->check_changeline_3->checkState() == Qt::Checked){
  110. str_rev = QString(recBuf).append("\r\n");
  111. }
  112. else
  113. {
  114. str_rev = QString(recBuf);
  115. }
  116. }
  117. }else{
  118. // 16进制显示,并转换为大写
  119. QString str1 = recBuf.toHex().toUpper();//.data();
  120. // 添加空格
  121. QString str2;
  122. for(int i = 0; i<str1.length (); i+=2)
  123. {
  124. str2 += str1.mid (i,2);
  125. str2 += " ";
  126. }
  127. if(ui->check_timestamp_3->checkState() == Qt::Checked)
  128. {
  129. QDateTime nowtime = QDateTime::currentDateTime();
  130. str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
  131. str_rev += str2.append("\r\n");
  132. }
  133. else
  134. {
  135. if(ui->check_changeline_3->checkState() == Qt::Checked)
  136. str_rev += str2.append("\r\n");
  137. else
  138. str_rev = str2;
  139. }
  140. }
  141. ui->recive_Edit_4->insertPlainText(str_rev);
  142. ui->recive_Edit_4->moveCursor(QTextCursor::End);
  143. }
  144. void MainWidget::on_Button_openserial_clicked()
  145. {
  146. if (!use_java)
  147. {
  148. if(ui->baudrate_CB_3->currentText()=="1200")
  149. Data_Ctrl::getData()->baudRate=QSerialPort::Baud1200;
  150. else if(ui->baudrate_CB_3->currentText()=="2400")
  151. Data_Ctrl::getData()->baudRate=QSerialPort::Baud2400;
  152. else if(ui->baudrate_CB_3->currentText()=="4800")
  153. Data_Ctrl::getData()->baudRate=QSerialPort::Baud4800;
  154. else if(ui->baudrate_CB_3->currentText()=="9600")
  155. Data_Ctrl::getData()->baudRate=QSerialPort::Baud9600;
  156. else if(ui->baudrate_CB_3->currentText()=="19200")
  157. Data_Ctrl::getData()->baudRate=QSerialPort::Baud19200;
  158. else if(ui->baudrate_CB_3->currentText()=="38400")
  159. Data_Ctrl::getData()->baudRate=QSerialPort::Baud38400;
  160. else if(ui->baudrate_CB_3->currentText()=="57600")
  161. Data_Ctrl::getData()->baudRate=QSerialPort::Baud57600;
  162. else if(ui->baudrate_CB_3->currentText()=="115200")
  163. Data_Ctrl::getData()->baudRate=QSerialPort::Baud115200;
  164. // 获取串口数据位
  165. if(ui->databit_CB_3->currentText()=="8")
  166. Data_Ctrl::getData()->dataBits=QSerialPort::Data5;
  167. else if(ui->databit_CB_3->currentText()=="7")
  168. Data_Ctrl::getData()->dataBits=QSerialPort::Data6;
  169. else if(ui->databit_CB_3->currentText()=="6")
  170. Data_Ctrl::getData()->dataBits=QSerialPort::Data7;
  171. else if(ui->databit_CB_3->currentText()=="5")
  172. Data_Ctrl::getData()->dataBits=QSerialPort::Data8;
  173. // 获取串口停止位
  174. if(ui->stopbit_CB_3->currentText()=="1")
  175. Data_Ctrl::getData()->stopBits=QSerialPort::OneStop;
  176. else if(ui->stopbit_CB_3->currentText()=="1.5")
  177. Data_Ctrl::getData()->stopBits=QSerialPort::OneAndHalfStop;
  178. else if(ui->stopbit_CB_3->currentText()=="2")
  179. Data_Ctrl::getData()->stopBits=QSerialPort::TwoStop;
  180. // 获取串口奇偶校验位
  181. if(ui->checkbit_CB_3->currentText() == "None"){
  182. Data_Ctrl::getData()->checkBits = QSerialPort::NoParity;
  183. }else if(ui->checkbit_CB_3->currentText() == "Odd"){
  184. Data_Ctrl::getData()->checkBits = QSerialPort::OddParity;
  185. }else if(ui->checkbit_CB_3->currentText() == "Even"){
  186. Data_Ctrl::getData()->checkBits = QSerialPort::EvenParity;
  187. }
  188. // 初始化串口属性,设置 端口号、波特率、数据位、停止位、奇偶校验位数
  189. Data_Ctrl::getData()->serialPort->setPortName(m_DevFile);
  190. //申请USB设备权限
  191. //QMessageBox::information(this, "确认", "申请权限:"+m_DevFile);
  192. requestUsbPermission(m_DevFile);
  193. // 根据初始化好的串口属性,打开串口
  194. // 如果打开成功,反转打开按钮显示和功能。打开失败,无变化,并且弹出错误对话框。
  195. if(ui->Button_openserial_3->text() == "打开串口"){
  196. if(m_USBCtrl.SeralPortCtrl(SeralCtrlType::Seral_Open)){
  197. //QMessageBox::
  198. ui->Button_openserial_3->setText("关闭串口");
  199. // 让端口号下拉框不可选,避免误操作(选择功能不可用,控件背景为灰色)
  200. ui->serialCB_3->setEnabled(false);
  201. }else{
  202. QMessageBox::critical(this, "错误提示", "串口打开失败!!!\r\n该串口可能被占用\r\n请选择正确的串口");
  203. }
  204. //statusBar 状态栏显示端口状态
  205. QString sm = "%1 OPENED, %2, 8, NONE, 1";
  206. QString status = sm.arg(Data_Ctrl::getData()->serialPort->portName()).arg(Data_Ctrl::getData()->serialPort->baudRate());
  207. lblPortState->setText(status);
  208. lblPortState->setStyleSheet("color:green");
  209. }
  210. else
  211. {
  212. m_USBCtrl.SeralPortCtrl(SeralCtrlType::Seral_Close);
  213. ui->Button_openserial_3->setText("打开串口");
  214. // 端口号下拉框恢复可选,避免误操作
  215. ui->serialCB_3->setEnabled(true);
  216. //statusBar 状态栏显示端口状态
  217. QString sm = "%1 CLOSED";
  218. QString status = sm.arg(Data_Ctrl::getData()->serialPort->portName());
  219. lblPortState->setText(status);
  220. lblPortState->setStyleSheet("color:red");
  221. }
  222. }
  223. else
  224. {
  225. if(m_openflag)
  226. {
  227. if(m_PreDevFile!=m_DevFile || m_DevFile=="")
  228. {
  229. m_openflag=false;
  230. if(m_PreDevFile!="")
  231. {
  232. QAndroidJniObject javaString = QAndroidJniObject::fromString(m_PreDevFile);
  233. jboolean res = QAndroidJniObject::callStaticMethod<jboolean>(
  234. "usb/USBListActivity",
  235. "closeSerial",
  236. "(Ljava/lang/String;)Z",
  237. javaString.object<jstring>());
  238. }
  239. }
  240. }
  241. if(!m_openflag)
  242. {
  243. if( m_DevFile!="")
  244. {
  245. requestUsbPermission(m_DevFile);
  246. QAndroidJniObject javaString = QAndroidJniObject::fromString(m_DevFile);
  247. jboolean res = QAndroidJniObject::callStaticMethod<jboolean>(
  248. "usb/USBListActivity",
  249. "OpenSerial",
  250. "(Ljava/lang/String;)Z",
  251. javaString.object<jstring>());
  252. if (res==true)
  253. {
  254. m_openflag=true;
  255. //QMessageBox::information(this, "确认", "打开成功!");
  256. }
  257. }
  258. }
  259. m_PreDevFile=m_DevFile;
  260. if(!m_openflag)
  261. {
  262. lblPortState->setText("disconnected");
  263. lblPortState->setStyleSheet("color:red");
  264. ui->Button_openserial_3->setText("打开串口");
  265. }
  266. else
  267. {
  268. lblPortState->setText("connected");
  269. lblPortState->setStyleSheet("color:green");
  270. ui->Button_openserial_3->setText("关闭串口");
  271. }
  272. }
  273. }
  274. /*发送数据*/
  275. void MainWidget::on_Button_tx_clicked()
  276. {
  277. if(!use_java)
  278. {
  279. QByteArray array;
  280. //Hex复选框
  281. if(ui->check_hexsend_4->checkState() == Qt::Checked){
  282. //array = QString2Hex(data); //HEX 16进制
  283. array = QByteArray::fromHex(ui->send_Edit_3->toPlainText().toUtf8()).data();
  284. }else{
  285. //array = data.toLatin1(); //ASCII
  286. array = ui->send_Edit_3->toPlainText().toLocal8Bit().data();
  287. }
  288. if(ui->check_sendnewline_4->checkState() == Qt::Checked){
  289. array.append("\r\n");
  290. }
  291. int a = Data_Ctrl::getData()->serialPort->write(array);
  292. // 发送字节计数并显示
  293. if(a > 0)
  294. {
  295. // 发送字节计数
  296. sendNum += a;
  297. // 状态栏显示计数值
  298. setNumOnLabel(lblSendNum, "S: ", sendNum);
  299. }
  300. else
  301. {
  302. ui->recive_Edit_4->insertPlainText("发送失败!!!!!");
  303. }
  304. }
  305. else
  306. {
  307. // 如发送成功,会返回发送的字符串,失败返回空字符串
  308. if(!m_openflag)
  309. {
  310. QMessageBox::information(this, "确认", " 发送失败!串口未打开!");
  311. return;
  312. }
  313. //int a = Data_Ctrl::getData()->serialPort->write(array);
  314. char OrderArray[8];
  315. OrderArray[0]=0x01;
  316. OrderArray[1]=0x03;
  317. OrderArray[2]=0x17;
  318. OrderArray[3]=0x70;
  319. OrderArray[4]=0x00;
  320. OrderArray[5]=0x02;
  321. OrderArray[6]=0xC0;
  322. OrderArray[7]=0x64;
  323. // 创建一个JNI环境并调用Java静态方法
  324. QAndroidJniEnvironment env;
  325. jbyteArray byteArray = env->NewByteArray(sizeof(OrderArray));
  326. env->SetByteArrayRegion(byteArray, 0, sizeof(OrderArray), reinterpret_cast<const jbyte*>(OrderArray));
  327. QAndroidJniObject sendbacktring = QAndroidJniObject::callStaticObjectMethod(
  328. "usb/USBListActivity",
  329. "writeData",
  330. "([B)Ljava/lang/String;", // 方法签名:接收字节数组并返回字符串
  331. byteArray // 参数
  332. );
  333. QString recsendinfo=sendbacktring.toString();
  334. // 发送字节计数并显示
  335. if(recsendinfo!="")
  336. {
  337. // 发送字节计数
  338. sendNum += 1;
  339. // 状态栏显示计数值
  340. setNumOnLabel(lblSendNum, "S: ", sendNum);
  341. QString hexString;
  342. QByteArray byteArray = recsendinfo.toLatin1(); // 将 QString 转换为 QByteArray,使用 UTF-8 编码
  343. for (char byte : byteArray) {
  344. // 使用 printf 格式化输出或 qDebug() 输出每个字节的十六进制表示
  345. hexString += QString("%1 ").arg(static_cast<unsigned char>(byte), 2, 16, QChar('0'));
  346. }
  347. ui->send_Edit_3->insertPlainText(hexString+"\n");
  348. }
  349. else
  350. {
  351. ui->send_Edit_3->insertPlainText("发送失败!!!!!\n");
  352. }
  353. on_Read_PDUStatus();
  354. }
  355. }
  356. void MainWidget::on_Button_clearrecive_clicked()
  357. {
  358. on_Read_PDUStatus();
  359. }
  360. void MainWidget::on_Button_cleartx_clicked()
  361. {
  362. ui->send_Edit_3->clear();
  363. ui->recive_Edit_4->clear();
  364. // 清除发送、接收字节计数
  365. sendNum = 0;
  366. recvNum = 0;
  367. // 状态栏显示计数值
  368. setNumOnLabel(lblSendNum, "S: ", sendNum);
  369. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  370. }
  371. void MainWidget::on_check_autosend_stateChanged(int arg1)
  372. {
  373. // 获取复选框状态,未选为0,选中为2
  374. if(arg1 == 0){
  375. timSend->stop();
  376. // 时间输入框恢复可选
  377. ui->spin_sendtime_4->setEnabled(true);
  378. }else{
  379. // 对输入的值做限幅,小于10ms会弹出对话框提示
  380. if(ui->spin_sendtime_4->text().toInt() >= 10){
  381. timSend->start(ui->spin_sendtime_4->text().toInt());// 设置定时时长,重新计数
  382. // 让时间输入框不可选,避免误操作(输入功能不可用,控件背景为灰色)
  383. ui->spin_sendtime_4->setEnabled(false);
  384. }else{
  385. ui->check_autosend_4->setCheckState(Qt::Unchecked);
  386. QMessageBox::critical(this, "错误提示", "定时发送的最小间隔为 10ms\r\n请确保输入的值 >=10");
  387. }
  388. }
  389. }
  390. void MainWidget::on_Button_checkserial_clicked()
  391. {
  392. ui->serialCB_3->clear();
  393. if(!use_java)
  394. {
  395. //扫描串口设备文件
  396. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  397. {
  398. ui->serialCB_3->addItem(info.portName());
  399. }
  400. }
  401. else
  402. {
  403. // 检查USB串口设备
  404. bool findFlag=false;
  405. QAndroidJniObject usbService = QAndroidJniObject::getStaticObjectField("android/content/Context",
  406. "USB_SERVICE",
  407. "Ljava/lang/String;");
  408. if (!usbService.isValid())
  409. {
  410. //logger("fail to get usb service");
  411. return;
  412. }
  413. //QAndroidJniObject appContext = QJniObject(QNativeInterface::QAndroidApplication::context());
  414. QAndroidJniObject activity = QtAndroid::androidActivity();
  415. QAndroidJniObject usbManager = activity.callObjectMethod("getSystemService",
  416. "(Ljava/lang/String;)Ljava/lang/Object;",
  417. usbService.object<jstring>());
  418. if (!usbManager.isValid())
  419. {
  420. //logger("fail to get usb manager");
  421. return;
  422. }
  423. QAndroidJniObject usbDeviceListHashMap = usbManager.callObjectMethod("getDeviceList",
  424. "()Ljava/util/HashMap;");
  425. QAndroidJniObject devListKeySet = usbDeviceListHashMap.callObjectMethod("keySet",
  426. "()Ljava/util/Set;");
  427. QAndroidJniObject devListIter = devListKeySet.callObjectMethod("iterator",
  428. "()Ljava/util/Iterator;");
  429. jint devListSize = usbDeviceListHashMap.callMethod<jint>("size", "()I");
  430. QAndroidJniObject usbDevObj;
  431. QAndroidJniObject usbDevObjIter;
  432. if(devListSize<1)
  433. {
  434. m_DevFile="";
  435. }
  436. else
  437. {
  438. for (int i = 0; i < devListSize; ++i)
  439. {
  440. usbDevObjIter = devListIter.callObjectMethod("next",
  441. "()Ljava/lang/Object;");
  442. usbDevObj = usbDeviceListHashMap.callObjectMethod("get",
  443. "(Ljava/lang/Object;)Ljava/lang/Object;",
  444. usbDevObjIter.object());
  445. m_DevVid = usbDevObj.callMethod<jint>("getVendorId", "()I");
  446. m_DevPid = usbDevObj.callMethod<jint>("getProductId", "()I");
  447. //QAndroidJniObject str((usbDevObj.callMethod<jstring>("getDeviceName", "()Ljava/lang/String;"));
  448. QAndroidJniObject str( usbDevObj.callObjectMethod(
  449. "getDeviceName",
  450. "()Ljava/lang/String;"
  451. ).object<jstring>());
  452. m_DevFile = str.toString();
  453. findFlag=true;
  454. ui->serialCB_3->addItem(m_DevFile);
  455. modifyUsbDeviceXml("device_filter.xml",QString::number(m_DevVid),QString::number(m_DevPid));
  456. }
  457. }
  458. //if(findFlag) QMessageBox::information(this, "确认", "检测到USB设备:"+m_DevFile);
  459. }
  460. }
  461. void MainWidget::slot_changeDebugMode()
  462. {
  463. int nIndex=ui->stackedWidget_3->currentIndex();
  464. if(nIndex<1)
  465. {
  466. ui->stackedWidget_3->setCurrentIndex(1);
  467. }else
  468. {
  469. ui->stackedWidget_3->setCurrentIndex(0);
  470. }
  471. }
  472. void MainWidget::setNumOnLabel(QLabel *lbl, QString strS, long num)
  473. {
  474. // 标签显示
  475. QString strN;
  476. strN=QString("%1").arg(num);
  477. QString str = strS + strN;
  478. lbl->setText(str);
  479. }
  480. void MainWidget::UpdateStatusInfo()
  481. {
  482. QString strTemp;
  483. //更新传感器及日期时间
  484. //m_PDUAllInfo.Sensor_Temperature=24.5;
  485. //m_PDUAllInfo.Sensor_Humidity=66.72;
  486. // m_PDUAllInfo.Sensor_INTemperature=82.33;
  487. //m_PDUAllInfo.Sensor_OUTTemperature=53.89;
  488. strTemp=QString::number(m_PDUAllInfo.Sensor_Temperature, 'f', 2);
  489. ui->label_temperature->setText(strTemp);
  490. strTemp=QString::number(m_PDUAllInfo.Sensor_Humidity, 'f', 2);
  491. ui->label_humidity->setText(strTemp);
  492. if(!m_PDUAllInfo.Sensor_LeakFlag)
  493. {
  494. ui->label_water->setText("未浸入");
  495. ui->label_water->setStyleSheet("color: rgb(10, 197, 50);");
  496. }
  497. else
  498. {
  499. ui->label_water->setText("浸入");
  500. // 切换颜色
  501. QColor currentColor = ui->label_water->palette().color(QPalette::WindowText);
  502. if (currentColor == Qt::white) {
  503. ui->label_water->setStyleSheet("color: red;");
  504. } else {
  505. ui->label_water->setStyleSheet("color: white;");
  506. }
  507. }
  508. strTemp=QString::number(m_PDUAllInfo.Sensor_INTemperature, 'f', 2);//进液温度
  509. ui->label_INT->setText(strTemp);
  510. strTemp=QString::number(m_PDUAllInfo.Sensor_OUTTemperature, 'f', 2);//出液温度
  511. ui->label_OUTT->setText(strTemp);
  512. QDateTime currentDateTime = QDateTime::currentDateTime();
  513. QDate currentDate = currentDateTime.date();
  514. QTime currentTime = currentDateTime.time();
  515. // 以字符串形式显示当前日期和时间
  516. QString dateString = currentDate.toString("yyyy-MM-dd");
  517. QString timeString = currentTime.toString("HH:mm:ss");
  518. ui->label_Date->setText(dateString);
  519. ui->label_Time->setText(timeString);
  520. //更新总体电源状态
  521. //m_PDUAllInfo.AllVoltage_L1+=0.2;
  522. //m_PDUAllInfo.AllVoltage_L2+=0.6;
  523. //m_PDUAllInfo.AllVoltage_L3+=0.3;
  524. //m_PDUAllInfo.AllCurrent_L1+=0.1;
  525. //m_PDUAllInfo.AllCurrent_L2+=0.2;
  526. //m_PDUAllInfo.AllCurrent_L3+=0.3;
  527. //m_PDUAllInfo.AllPower_L1+=0.01;
  528. //m_PDUAllInfo.AllPower_L2+=0.02;
  529. // m_PDUAllInfo.AllPower_L3+=0.03;
  530. //m_PDUAllInfo.AllConsumption_L1+=0.05;
  531. //m_PDUAllInfo.AllConsumption_L2+=0.09;
  532. //m_PDUAllInfo.AllConsumption_L3+=0.03;
  533. strTemp=QString::number(m_PDUAllInfo.AllVoltage_L1, 'f', 2);
  534. ui->label_V1->setText(strTemp);
  535. strTemp=QString::number(m_PDUAllInfo.AllCurrent_L1, 'f', 2);
  536. ui->label_I1->setText(strTemp);
  537. strTemp=QString::number(m_PDUAllInfo.AllPower_L1, 'f', 2);
  538. //ui->label_P1->setText(strTemp);
  539. strTemp=QString::number(m_PDUAllInfo.AllConsumption_L1, 'f', 2);
  540. //ui->label_C1->setText(strTemp);
  541. strTemp=QString::number(m_PDUAllInfo.AllVoltage_L2, 'f', 2);
  542. ui->label_V2->setText(strTemp);
  543. strTemp=QString::number(m_PDUAllInfo.AllCurrent_L2, 'f', 2);
  544. ui->label_I2->setText(strTemp);
  545. strTemp=QString::number(m_PDUAllInfo.AllPower_L2, 'f', 2);
  546. //ui->label_P2->setText(strTemp);
  547. strTemp=QString::number(m_PDUAllInfo.AllConsumption_L2, 'f', 2);
  548. //ui->label_C2->setText(strTemp);
  549. strTemp=QString::number(m_PDUAllInfo.AllVoltage_L3, 'f', 2);
  550. ui->label_V3->setText(strTemp);
  551. strTemp=QString::number(m_PDUAllInfo.AllCurrent_L3, 'f', 2);
  552. ui->label_I3->setText(strTemp);
  553. strTemp=QString::number(m_PDUAllInfo.AllPower_L3, 'f', 2);
  554. //ui->label_P3->setText(strTemp);
  555. strTemp=QString::number(m_PDUAllInfo.AllConsumption_L3, 'f', 2);
  556. //ui->label_C3->setText(strTemp);
  557. //更新通道信息
  558. /*
  559. for (int i=0;i<64;i++) {
  560. m_PDUCHInfo[i].CHVoltage+=0.432;
  561. m_PDUCHInfo[i].CHPower+=0.343;
  562. m_PDUCHInfo[i].CHCurrent+=0.112;
  563. m_PDUCHInfo[i].CHConsumption+=0.063;
  564. m_PDUCHInfo[i].CHFactor=0.983;
  565. if(i%2==0)m_PDUCHInfo[i].CHStatus=true;
  566. }*/
  567. for (int i=0;i<m_TotalCHNum;i++) {
  568. m_chWidget[i].chid=i+1;
  569. m_chWidget[i].chV=m_PDUCHInfo[i].CHVoltage;
  570. m_chWidget[i].chI=m_PDUCHInfo[i].CHCurrent;
  571. m_chWidget[i].chStatus=m_PDUCHInfo[i].CHStatus;
  572. m_chWidget[i].UpdateStatusInfo();
  573. }
  574. }
  575. void MainWidget::requestUsbPermission(const QString &devicePath)
  576. {
  577. QAndroidJniObject activity = QtAndroid::androidActivity();
  578. if (!activity.isValid()) {
  579. qDebug() << "Failed to get Android activity.";
  580. return;
  581. }
  582. QAndroidJniObject context = activity.callObjectMethod("getApplicationContext", "()Landroid/content/Context;");
  583. if (!context.isValid()) {
  584. qDebug() << "Failed to get application context.";
  585. return;
  586. }
  587. // Get the USB manager from the system service.
  588. QAndroidJniObject usbServiceName = QAndroidJniObject::getStaticObjectField(
  589. "android/content/Context",
  590. "USB_SERVICE",
  591. "Ljava/lang/String;"
  592. );
  593. QAndroidJniObject usbManager = context.callObjectMethod(
  594. "getSystemService",
  595. "(Ljava/lang/String;)Ljava/lang/Object;",
  596. usbServiceName.object<jstring>());
  597. if (!usbManager.isValid()) {
  598. qDebug() << "Failed to get UsbManager.";
  599. return;
  600. }
  601. // Find the USB device by its path.
  602. QAndroidJniObject usbDevice = usbManager.callObjectMethod(
  603. "getDeviceList",
  604. "()Ljava/util/HashMap;"
  605. ).callObjectMethod(
  606. "get",
  607. "(Ljava/lang/Object;)Ljava/lang/Object;",
  608. QAndroidJniObject::fromString(devicePath).object<jobject>()
  609. );
  610. if (!usbDevice.isValid()) {
  611. qDebug() << "USB device not found: " << devicePath;
  612. QMessageBox::information(this, "确认", "USB device not found: " + devicePath);
  613. return;
  614. }
  615. // Check if we already have permission for this device.
  616. bool hasPermission = QAndroidJniObject::callStaticMethod<jboolean>(
  617. "android/hardware/usb/UsbManager",
  618. "hasPermission",
  619. "(Landroid/hardware/usb/UsbDevice;)Z",
  620. usbDevice.object<jobject>());
  621. if (hasPermission) {
  622. qDebug() << "USB device opened successfully.";
  623. //QMessageBox::information(this, "确认", "USB device opened successfully: " + devicePath);
  624. } else {
  625. qDebug() << "Requesting permission for USB device.";
  626. //QMessageBox::information(this, "确认", "Requesting permission for USB device: " + devicePath);
  627. // Create a PendingIntent to receive the result of the permission request.
  628. QAndroidJniObject intentFilter = QAndroidJniObject::fromString("com.example.ACTION_USB_PERMISSION");
  629. QAndroidJniObject intent("android/content/Intent", "(Ljava/lang/String;)V", intentFilter.object<jstring>());
  630. QAndroidJniObject pendingIntent = QAndroidJniObject::callStaticObjectMethod("android/app/PendingIntent",
  631. "getBroadcast",
  632. "(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;",
  633. context.object<jobject>(),
  634. 0,
  635. intent.object<jobject>(),
  636. 0x00000080); // FLAG_MUTABLE or FLAG_IMMUTABLE based on your target SDK
  637. usbManager.callMethod<void>("requestPermission",
  638. "(Landroid/hardware/usb/UsbDevice;Landroid/app/PendingIntent;)V",
  639. usbDevice.object<jobject>(),
  640. pendingIntent.object<jobject>());
  641. }
  642. }
  643. bool MainWidget::modifyUsbDeviceXml(const QString &filePath, const QString &newVendorId, const QString &newProductId)
  644. {
  645. QFile file(filePath);
  646. if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  647. qWarning() << "Failed to open file for reading:" << file.errorString();
  648. return false;
  649. }
  650. // 读取文件内容到QDomDocument
  651. QDomDocument doc;
  652. if (!doc.setContent(&file)) {
  653. qWarning() << "Failed to parse XML file:" << file.errorString();
  654. file.close();
  655. return false;
  656. }
  657. file.close();
  658. // 查找<usb-device>元素并修改其属性
  659. QDomElement root = doc.firstChildElement("resources");
  660. QDomElement usbDevice = root.firstChildElement("usb-device");
  661. if (!usbDevice.isNull()) {
  662. usbDevice.setAttribute("vendor-id", newVendorId);
  663. usbDevice.setAttribute("product-id", newProductId);
  664. } else {
  665. qWarning() << "No <usb-device> element found in the XML file.";
  666. return false;
  667. }
  668. // 将修改后的内容写回文件
  669. if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
  670. qWarning() << "Failed to open file for writing:" << file.errorString();
  671. return false;
  672. }
  673. QTextStream out(&file);
  674. out << doc.toString(4); // 使用4个空格进行缩进,以便格式化输出
  675. file.close();
  676. return true;
  677. }
  678. QString MainWidget::on_Read_PDUStatus()
  679. {
  680. // 如接收成功,会返回接收的字符串,失败返回空字符串
  681. QString Allrecinfo="";
  682. for (int i=0;i<10;i++)
  683. {
  684. QAndroidJniObject recbacktring = QAndroidJniObject::callStaticObjectMethod(
  685. "usb/USBListActivity",
  686. "readData",
  687. "()Ljava/lang/String;");
  688. QString recinfo=recbacktring.toString();
  689. // 发送字节计数并显示
  690. if(recinfo!="")
  691. {
  692. QString hexString;
  693. QByteArray byteArray = recinfo.toLatin1(); // 将 QString 转换为 QByteArray,使用 UTF-8 编码
  694. for (char byte : byteArray) {
  695. // 使用 printf 格式化输出或 qDebug() 输出每个字节的十六进制表示
  696. hexString += QString("%1 ").arg(static_cast<unsigned char>(byte), 2, 16, QChar('0'));
  697. }
  698. Allrecinfo+=hexString;
  699. }
  700. else
  701. {
  702. break;
  703. }
  704. }
  705. // 发送字节计数并显示
  706. if(Allrecinfo!="")
  707. {
  708. // 发送字节计数
  709. recvNum += 1;
  710. // 状态栏显示计数值
  711. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  712. ui->recive_Edit_4->insertPlainText(Allrecinfo+"\n");
  713. }
  714. else
  715. {
  716. //ui->recive_Edit_4->insertPlainText("接收失败!!!!!\n");
  717. }
  718. return Allrecinfo;
  719. }
  720. void MainWidget::on_add_PDUStatus(const QString &sendstr, const QString &recstr)
  721. {
  722. // 发送字节计数并显示
  723. if(sendstr!="")
  724. {
  725. // 发送字节计数
  726. sendNum += 1;
  727. // 状态栏显示计数值
  728. setNumOnLabel(lblSendNum, "S: ", sendNum);
  729. ui->send_Edit_3->insertPlainText(sendstr+"\n");
  730. }
  731. else
  732. {
  733. //ui->send_Edit_3->insertPlainText("发送失败!!!!!\n");
  734. }
  735. // 接收字节计数并显示
  736. if(recstr!="")
  737. {
  738. // 发送字节计数
  739. recvNum += 1;
  740. // 状态栏显示计数值
  741. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  742. ui->recive_Edit_4->insertPlainText(recstr+"\n");
  743. }
  744. else
  745. {
  746. //ui->recive_Edit_4->insertPlainText("接收失败!!!!!\n");
  747. }
  748. }
  749. void MainWidget::on_check_autoprintf_stateChanged(int arg1)
  750. {
  751. // 获取复选框状态,未选为0,选中为2
  752. if(arg1 == 0){
  753. m_printflag=false;
  754. }else{
  755. m_printflag=true;
  756. }
  757. }