mainwidget.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. #include "mainwidget.h"
  2. #include "ui_mainwidget.h"
  3. #include "Data_Ctrl.h"
  4. #include <QMessageBox>
  5. #include <QDir>
  6. MainWidget::MainWidget(QWidget *parent)
  7. : QWidget(parent)
  8. , ui(new Ui::MainWidget)
  9. {
  10. ui->setupUi(this);
  11. ui->serialCB_3->clear();
  12. m_USBCtrl.SerialPortInit();
  13. connect(Data_Ctrl::getData()->serialPort,SIGNAL(readyRead()),this,SLOT(manual_serialPortReadyRead()));/*手动连接槽函数*/
  14. //InitSerial();
  15. InitUI();
  16. InitConnect();
  17. // 定时发送-定时器
  18. timSend = new QTimer;
  19. timSend->setInterval(1000);// 设置默认定时时长1000ms
  20. connect(timSend, &QTimer::timeout, this, [=](){
  21. on_Button_tx_clicked();
  22. });
  23. //QString currentPath = QDir::currentPath();
  24. m_TotalCHNum=14;
  25. for (int i=0;i<64;i++) {
  26. m_PDUCHInfo[i].CHNum=i+1;
  27. m_PDUCHInfo[i].CHName=QString("CH%1").arg(i+1);
  28. m_chWidget[i].chid=i+1;
  29. }
  30. _timer_update_info = new QTimer(this);
  31. _timer_update_info->setInterval(1000);
  32. connect(_timer_update_info, SIGNAL(timeout()), this, SLOT(UpdateStatusInfo()));
  33. _timer_update_info->start();
  34. }
  35. MainWidget::~MainWidget()
  36. {
  37. delete ui;
  38. }
  39. void MainWidget::InitUI()
  40. {
  41. //通过QSerialPortInfo查找可用串口
  42. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  43. {
  44. ui->serialCB_3->addItem(info.portName());
  45. }
  46. // 发送、接收计数清零
  47. sendNum = 0;
  48. recvNum = 0;
  49. // 状态栏的收、发计数标签
  50. lblSendNum = new QLabel(this);
  51. lblRecvNum = new QLabel(this);
  52. lblPortState = new QLabel(this);
  53. lblPortState->setText("Connected");
  54. //设置串口状态标签为绿色 表示已连接状态
  55. lblPortState->setStyleSheet("color:red");
  56. // 设置标签最小大小
  57. lblSendNum->setMinimumSize(100, 20);
  58. lblRecvNum->setMinimumSize(100, 20);
  59. lblPortState->setMinimumSize(550, 20);
  60. setNumOnLabel(lblSendNum, "S: ", sendNum);
  61. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  62. // 从右往左依次添加
  63. ui->horizontalLayout_15->addWidget(lblPortState);
  64. ui->horizontalLayout_15->addWidget(lblSendNum);
  65. ui->horizontalLayout_15->addWidget(lblRecvNum);
  66. ui->pb_Debug->setIcon(QIcon(":/resource/Serial.png"));
  67. ui->label_INT->setStyleSheet("color: rgb(0, 218, 205);");
  68. ui->label_26->setStyleSheet("color: rgb(0, 218, 205);");
  69. ui->label_OUTT->setStyleSheet("color: orange;");
  70. ui->label_29->setStyleSheet("color: orange;");
  71. // 创建一个 QWidget,并添加一些内容
  72. ui->gridLayout->setContentsMargins(1, 1, 1, 1);
  73. ui->gridLayout->setHorizontalSpacing(20);
  74. ui->gridLayout->setVerticalSpacing(8);
  75. m_TotalCHNum=14;
  76. for (int i=0;i<m_TotalCHNum;i++) {
  77. ui->gridLayout->addWidget(&m_chWidget[i], i%((m_TotalCHNum+1)/2), i/((m_TotalCHNum+1)/2));
  78. }
  79. QString styleSheet = "QWidget { background-color: #rgb(11, 17, 45); }";
  80. //ui->MainWidget->setStyleSheet(styleSheet);
  81. }
  82. void MainWidget::InitConnect()
  83. {
  84. connect(ui->pb_Debug,SIGNAL(clicked()),this,SLOT(slot_changeDebugMode()));
  85. connect(ui->Button_checkserial_3,SIGNAL(clicked()),this,SLOT(on_Button_checkserial_clicked()));
  86. connect(ui->Button_openserial_3,SIGNAL(clicked()),this,SLOT(on_Button_openserial_clicked()));
  87. connect(ui->Button_clearrecive_3,SIGNAL(clicked()),this,SLOT(on_Button_clearrecive_clicked()));
  88. connect(ui->Button_tx_4,SIGNAL(clicked()),this,SLOT(on_Button_tx_clicked()));
  89. connect(ui->Button_cleartx_4,SIGNAL(clicked()),this,SLOT(on_Button_cleartx_clicked()));
  90. }
  91. bool MainWidget::InitSerial()
  92. {
  93. /*
  94. QAndroidJniObject javaString = QAndroidJniObject::fromString("ttys1");
  95. jboolean res = QAndroidJniObject::callStaticMethod<jboolean>(
  96. "usb/USBListActivity",
  97. "OpenSerial",
  98. "(Ljava/lang/String;)Z",
  99. javaString.object<jstring>());
  100. */
  101. }
  102. void MainWidget::manual_serialPortReadyRead()
  103. {
  104. QByteArray recBuf = Data_Ctrl::getData()->serialPort->readAll();;
  105. QString str_rev;
  106. // 接收字节计数
  107. recvNum += recBuf.size();
  108. // 状态栏显示计数值
  109. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  110. if(ui->check_hex_recive_3->checkState() == false){
  111. if(ui->check_timestamp_3->checkState() == Qt::Checked){
  112. QDateTime nowtime = QDateTime::currentDateTime();
  113. str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
  114. str_rev += QString(recBuf).append("\r\n");
  115. }
  116. else{
  117. // 在当前位置插入文本,不会发生换行。如果没有移动光标到文件结尾,会导致文件超出当前界面显示范围,界面也不会向下滚动。
  118. //ui->recvEdit->appendPlainText(buf);
  119. if(ui->check_changeline_3->checkState() == Qt::Checked){
  120. str_rev = QString(recBuf).append("\r\n");
  121. }
  122. else
  123. {
  124. str_rev = QString(recBuf);
  125. }
  126. }
  127. }else{
  128. // 16进制显示,并转换为大写
  129. QString str1 = recBuf.toHex().toUpper();//.data();
  130. // 添加空格
  131. QString str2;
  132. for(int i = 0; i<str1.length (); i+=2)
  133. {
  134. str2 += str1.mid (i,2);
  135. str2 += " ";
  136. }
  137. if(ui->check_timestamp_3->checkState() == Qt::Checked)
  138. {
  139. QDateTime nowtime = QDateTime::currentDateTime();
  140. str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
  141. str_rev += str2.append("\r\n");
  142. }
  143. else
  144. {
  145. if(ui->check_changeline_3->checkState() == Qt::Checked)
  146. str_rev += str2.append("\r\n");
  147. else
  148. str_rev = str2;
  149. }
  150. }
  151. ui->recive_Edit_4->insertPlainText(str_rev);
  152. ui->recive_Edit_4->moveCursor(QTextCursor::End);
  153. }
  154. void MainWidget::on_Button_openserial_clicked()
  155. {
  156. if(ui->baudrate_CB_3->currentText()=="1200")
  157. Data_Ctrl::getData()->baudRate=QSerialPort::Baud1200;
  158. else if(ui->baudrate_CB_3->currentText()=="2400")
  159. Data_Ctrl::getData()->baudRate=QSerialPort::Baud2400;
  160. else if(ui->baudrate_CB_3->currentText()=="4800")
  161. Data_Ctrl::getData()->baudRate=QSerialPort::Baud4800;
  162. else if(ui->baudrate_CB_3->currentText()=="9600")
  163. Data_Ctrl::getData()->baudRate=QSerialPort::Baud9600;
  164. else if(ui->baudrate_CB_3->currentText()=="19200")
  165. Data_Ctrl::getData()->baudRate=QSerialPort::Baud19200;
  166. else if(ui->baudrate_CB_3->currentText()=="38400")
  167. Data_Ctrl::getData()->baudRate=QSerialPort::Baud38400;
  168. else if(ui->baudrate_CB_3->currentText()=="57600")
  169. Data_Ctrl::getData()->baudRate=QSerialPort::Baud57600;
  170. else if(ui->baudrate_CB_3->currentText()=="115200")
  171. Data_Ctrl::getData()->baudRate=QSerialPort::Baud115200;
  172. // 获取串口数据位
  173. if(ui->databit_CB_3->currentText()=="8")
  174. Data_Ctrl::getData()->dataBits=QSerialPort::Data5;
  175. else if(ui->databit_CB_3->currentText()=="7")
  176. Data_Ctrl::getData()->dataBits=QSerialPort::Data6;
  177. else if(ui->databit_CB_3->currentText()=="6")
  178. Data_Ctrl::getData()->dataBits=QSerialPort::Data7;
  179. else if(ui->databit_CB_3->currentText()=="5")
  180. Data_Ctrl::getData()->dataBits=QSerialPort::Data8;
  181. // 获取串口停止位
  182. if(ui->stopbit_CB_3->currentText()=="1")
  183. Data_Ctrl::getData()->stopBits=QSerialPort::OneStop;
  184. else if(ui->stopbit_CB_3->currentText()=="1.5")
  185. Data_Ctrl::getData()->stopBits=QSerialPort::OneAndHalfStop;
  186. else if(ui->stopbit_CB_3->currentText()=="2")
  187. Data_Ctrl::getData()->stopBits=QSerialPort::TwoStop;
  188. // 获取串口奇偶校验位
  189. if(ui->checkbit_CB_3->currentText() == "None"){
  190. Data_Ctrl::getData()->checkBits = QSerialPort::NoParity;
  191. }else if(ui->checkbit_CB_3->currentText() == "Odd"){
  192. Data_Ctrl::getData()->checkBits = QSerialPort::OddParity;
  193. }else if(ui->checkbit_CB_3->currentText() == "Even"){
  194. Data_Ctrl::getData()->checkBits = QSerialPort::EvenParity;
  195. }
  196. // 初始化串口属性,设置 端口号、波特率、数据位、停止位、奇偶校验位数
  197. Data_Ctrl::getData()->serialPort->setPortName(ui->serialCB_3->currentText());
  198. // 根据初始化好的串口属性,打开串口
  199. // 如果打开成功,反转打开按钮显示和功能。打开失败,无变化,并且弹出错误对话框。
  200. if(ui->Button_openserial_3->text() == "打开串口"){
  201. if(m_USBCtrl.SeralPortCtrl(SeralCtrlType::Seral_Open)){
  202. //QMessageBox::
  203. ui->Button_openserial_3->setText("关闭串口");
  204. // 让端口号下拉框不可选,避免误操作(选择功能不可用,控件背景为灰色)
  205. ui->serialCB_3->setEnabled(false);
  206. }else{
  207. QMessageBox::critical(this, "错误提示", "串口打开失败!!!\r\n该串口可能被占用\r\n请选择正确的串口");
  208. }
  209. //statusBar 状态栏显示端口状态
  210. QString sm = "%1 OPENED, %2, 8, NONE, 1";
  211. QString status = sm.arg(Data_Ctrl::getData()->serialPort->portName()).arg(Data_Ctrl::getData()->serialPort->baudRate());
  212. lblPortState->setText(status);
  213. lblPortState->setStyleSheet("color:green");
  214. }else{
  215. m_USBCtrl.SeralPortCtrl(SeralCtrlType::Seral_Close);
  216. ui->Button_openserial_3->setText("打开串口");
  217. // 端口号下拉框恢复可选,避免误操作
  218. ui->serialCB_3->setEnabled(true);
  219. //statusBar 状态栏显示端口状态
  220. QString sm = "%1 CLOSED";
  221. QString status = sm.arg(Data_Ctrl::getData()->serialPort->portName());
  222. lblPortState->setText(status);
  223. lblPortState->setStyleSheet("color:red");
  224. }
  225. }
  226. /*发送数据*/
  227. void MainWidget::on_Button_tx_clicked()
  228. {
  229. QByteArray array;
  230. //Hex复选框
  231. if(ui->check_hexsend_4->checkState() == Qt::Checked){
  232. //array = QString2Hex(data); //HEX 16进制
  233. array = QByteArray::fromHex(ui->send_Edit_3->toPlainText().toUtf8()).data();
  234. }else{
  235. //array = data.toLatin1(); //ASCII
  236. array = ui->send_Edit_3->toPlainText().toLocal8Bit().data();
  237. }
  238. if(ui->check_sendnewline_4->checkState() == Qt::Checked){
  239. array.append("\r\n");
  240. }
  241. // 如发送成功,会返回发送的字节长度。失败,返回-1。
  242. int a = Data_Ctrl::getData()->serialPort->write(array);
  243. // 发送字节计数并显示
  244. if(a > 0)
  245. {
  246. // 发送字节计数
  247. sendNum += a;
  248. // 状态栏显示计数值
  249. setNumOnLabel(lblSendNum, "S: ", sendNum);
  250. }
  251. else
  252. {
  253. QMessageBox::StandardButton confimBtn = QMessageBox::question(this, "确认", " 串口信息发送失败!", QMessageBox::Ok | QMessageBox::Cancel);
  254. if (confimBtn == QMessageBox::Cancel) {
  255. return;
  256. }
  257. else
  258. {
  259. return;
  260. }
  261. }
  262. }
  263. void MainWidget::on_Button_clearrecive_clicked()
  264. {
  265. ui->recive_Edit_4->clear();
  266. // 清除发送、接收字节计数
  267. sendNum = 0;
  268. recvNum = 0;
  269. // 状态栏显示计数值
  270. setNumOnLabel(lblSendNum, "S: ", sendNum);
  271. setNumOnLabel(lblRecvNum, "R: ", recvNum);
  272. }
  273. void MainWidget::on_Button_cleartx_clicked()
  274. {
  275. ui->recive_Edit_4->clear();
  276. // 清除发送字节计数
  277. sendNum = 0;
  278. // 状态栏显示计数值
  279. setNumOnLabel(lblSendNum, "S: ", sendNum);
  280. }
  281. void MainWidget::on_check_autosend_stateChanged(int arg1)
  282. {
  283. // 获取复选框状态,未选为0,选中为2
  284. if(arg1 == 0){
  285. timSend->stop();
  286. // 时间输入框恢复可选
  287. ui->spin_sendtime_4->setEnabled(true);
  288. }else{
  289. // 对输入的值做限幅,小于10ms会弹出对话框提示
  290. if(ui->spin_sendtime_4->text().toInt() >= 10){
  291. timSend->start(ui->spin_sendtime_4->text().toInt());// 设置定时时长,重新计数
  292. // 让时间输入框不可选,避免误操作(输入功能不可用,控件背景为灰色)
  293. ui->spin_sendtime_4->setEnabled(false);
  294. }else{
  295. ui->check_autosend_4->setCheckState(Qt::Unchecked);
  296. QMessageBox::critical(this, "错误提示", "定时发送的最小间隔为 10ms\r\n请确保输入的值 >=10");
  297. }
  298. }
  299. }
  300. void MainWidget::on_Button_checkserial_clicked()
  301. {
  302. ui->serialCB_3->clear();
  303. //通过QSerialPortInfo查找可用串口
  304. //foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  305. //{
  306. // ui->serialCB_3->addItem(info.portName());
  307. // }
  308. QJniObject usbService = QJniObject::getStaticObjectField("android/content/Context",
  309. "USB_SERVICE",
  310. "Ljava/lang/String;");
  311. if (!usbService.isValid())
  312. {
  313. //logger("fail to get usb service");
  314. return;
  315. }
  316. QJniObject appContext = QJniObject(QNativeInterface::QAndroidApplication::context());
  317. QJniObject activity = QJniObject(appContext);
  318. QJniObject usbManager = activity.callObjectMethod("getSystemService",
  319. "(Ljava/lang/String;)Ljava/lang/Object;",
  320. usbService.object<jstring>());
  321. if (!usbManager.isValid())
  322. {
  323. //logger("fail to get usb manager");
  324. return;
  325. }
  326. QJniObject usbDeviceListHashMap = usbManager.callObjectMethod("getDeviceList",
  327. "()Ljava/util/HashMap;");
  328. QJniObject devListKeySet = usbDeviceListHashMap.callObjectMethod("keySet",
  329. "()Ljava/util/Set;");
  330. QJniObject devListIter = devListKeySet.callObjectMethod("iterator",
  331. "()Ljava/util/Iterator;");
  332. jint devListSize = usbDeviceListHashMap.callMethod<jint>("size", "()I");
  333. QJniObject usbDevObj;
  334. QJniObject usbDevObjIter;
  335. int vid = 0, pid = 0;
  336. QString devName;
  337. for (int i = 0; i < devListSize; ++i)
  338. {
  339. usbDevObjIter = devListIter.callObjectMethod("next",
  340. "()Ljava/lang/Object;");
  341. usbDevObj = usbDeviceListHashMap.callObjectMethod("get",
  342. "(Ljava/lang/Object;)Ljava/lang/Object;",
  343. usbDevObjIter.object());
  344. vid = usbDevObj.callMethod<jint>("getVendorId", "()I");
  345. pid = usbDevObj.callMethod<jint>("getProductId", "()I");
  346. //QAndroidJniObject str((usbDevObj.callMethod<jstring>("getDeviceName", "()Ljava/lang/String;"));
  347. QJniObject str( usbDevObj.callObjectMethod(
  348. "getDeviceName",
  349. "()Ljava/lang/String;"
  350. ).object<jstring>());
  351. devName = str.toString();
  352. ui->serialCB_3->addItem(devName);
  353. }
  354. }
  355. void MainWidget::slot_changeDebugMode()
  356. {
  357. int nIndex=ui->stackedWidget_3->currentIndex();
  358. if(nIndex<1)
  359. {
  360. ui->stackedWidget_3->setCurrentIndex(1);
  361. }else
  362. {
  363. ui->stackedWidget_3->setCurrentIndex(0);
  364. }
  365. }
  366. void MainWidget::setNumOnLabel(QLabel *lbl, QString strS, long num)
  367. {
  368. // 标签显示
  369. QString strN;
  370. strN=QString("CH%1").arg(num);
  371. QString str = strS + strN;
  372. lbl->setText(str);
  373. }
  374. void MainWidget::UpdateStatusInfo()
  375. {
  376. QString strTemp;
  377. //更新传感器及日期时间
  378. m_PDUAllInfo.Sensor_Temperature=24.5;
  379. m_PDUAllInfo.Sensor_Humidity=66.72;
  380. m_PDUAllInfo.Sensor_INTemperature=82.33;
  381. m_PDUAllInfo.Sensor_OUTTemperature=53.89;
  382. strTemp=QString::number(m_PDUAllInfo.Sensor_Temperature, 'f', 2);
  383. ui->label_temperature->setText(strTemp);
  384. strTemp=QString::number(m_PDUAllInfo.Sensor_Humidity, 'f', 2);
  385. ui->label_humidity->setText(strTemp);
  386. if(!m_PDUAllInfo.Sensor_WaterImmersion)
  387. {
  388. ui->label_water->setText("未浸入");
  389. ui->label_water->setStyleSheet("color: rgb(10, 197, 50);");
  390. }
  391. else
  392. {
  393. ui->label_water->setText("浸入");
  394. // 切换颜色
  395. QColor currentColor = ui->label_water->palette().color(QPalette::WindowText);
  396. if (currentColor == Qt::white) {
  397. ui->label_water->setStyleSheet("color: red;");
  398. } else {
  399. ui->label_water->setStyleSheet("color: white;");
  400. }
  401. }
  402. strTemp=QString::number(m_PDUAllInfo.Sensor_INTemperature, 'f', 2);//进液温度
  403. ui->label_INT->setText(strTemp);
  404. strTemp=QString::number(m_PDUAllInfo.Sensor_OUTTemperature, 'f', 2);//出液温度
  405. ui->label_OUTT->setText(strTemp);
  406. QDateTime currentDateTime = QDateTime::currentDateTime();
  407. QDate currentDate = currentDateTime.date();
  408. QTime currentTime = currentDateTime.time();
  409. // 以字符串形式显示当前日期和时间
  410. QString dateString = currentDate.toString("yyyy-MM-dd");
  411. QString timeString = currentTime.toString("HH:mm:ss");
  412. ui->label_Date->setText(dateString);
  413. ui->label_Time->setText(timeString);
  414. //更新总体电源状态
  415. m_PDUAllInfo.AllVoltage_L1+=0.2;
  416. m_PDUAllInfo.AllVoltage_L2+=0.6;
  417. m_PDUAllInfo.AllVoltage_L3+=0.3;
  418. m_PDUAllInfo.AllCurrent_L1+=0.1;
  419. m_PDUAllInfo.AllCurrent_L2+=0.2;
  420. m_PDUAllInfo.AllCurrent_L3+=0.3;
  421. m_PDUAllInfo.AllPower_L1+=0.01;
  422. m_PDUAllInfo.AllPower_L2+=0.02;
  423. m_PDUAllInfo.AllPower_L3+=0.03;
  424. m_PDUAllInfo.AllConsumption_L1+=0.05;
  425. m_PDUAllInfo.AllConsumption_L2+=0.09;
  426. m_PDUAllInfo.AllConsumption_L3+=0.03;
  427. strTemp=QString::number(m_PDUAllInfo.AllVoltage_L1, 'f', 2);
  428. ui->label_V1->setText(strTemp);
  429. strTemp=QString::number(m_PDUAllInfo.AllCurrent_L1, 'f', 2);
  430. ui->label_I1->setText(strTemp);
  431. strTemp=QString::number(m_PDUAllInfo.AllPower_L1, 'f', 2);
  432. //ui->label_P1->setText(strTemp);
  433. strTemp=QString::number(m_PDUAllInfo.AllConsumption_L1, 'f', 2);
  434. //ui->label_C1->setText(strTemp);
  435. strTemp=QString::number(m_PDUAllInfo.AllVoltage_L2, 'f', 2);
  436. ui->label_V2->setText(strTemp);
  437. strTemp=QString::number(m_PDUAllInfo.AllCurrent_L2, 'f', 2);
  438. ui->label_I2->setText(strTemp);
  439. strTemp=QString::number(m_PDUAllInfo.AllPower_L2, 'f', 2);
  440. //ui->label_P2->setText(strTemp);
  441. strTemp=QString::number(m_PDUAllInfo.AllConsumption_L2, 'f', 2);
  442. //ui->label_C2->setText(strTemp);
  443. strTemp=QString::number(m_PDUAllInfo.AllVoltage_L3, 'f', 2);
  444. ui->label_V3->setText(strTemp);
  445. strTemp=QString::number(m_PDUAllInfo.AllCurrent_L3, 'f', 2);
  446. ui->label_I3->setText(strTemp);
  447. strTemp=QString::number(m_PDUAllInfo.AllPower_L3, 'f', 2);
  448. //ui->label_P3->setText(strTemp);
  449. strTemp=QString::number(m_PDUAllInfo.AllConsumption_L3, 'f', 2);
  450. //ui->label_C3->setText(strTemp);
  451. //更新通道信息
  452. for (int i=0;i<64;i++) {
  453. m_PDUCHInfo[i].CHVoltage+=0.432;
  454. m_PDUCHInfo[i].CHPower+=0.343;
  455. m_PDUCHInfo[i].CHCurrent+=0.112;
  456. m_PDUCHInfo[i].CHConsumption+=0.063;
  457. m_PDUCHInfo[i].CHFactor=0.983;
  458. if(i%2==0)m_PDUCHInfo[i].CHStatus=true;
  459. }
  460. for (int i=0;i<m_TotalCHNum;i++) {
  461. m_chWidget[i].chid=i+1;
  462. m_chWidget[i].chV=m_PDUCHInfo[i].CHVoltage;
  463. m_chWidget[i].chI=m_PDUCHInfo[i].CHCurrent;
  464. m_chWidget[i].chStatus=m_PDUCHInfo[i].CHStatus;
  465. m_chWidget[i].UpdateStatusInfo();
  466. }
  467. }