——文档转载自电子发烧友
使用迪文COF结构智能屏及其串口通信接口,结合电脑端QT上位机进行基于串口通信的上位机的图表远程监控界面。图案完全由QT上位机DIY定制,省去造轮子,可以使用QT上位机的高级GUI控件如渐变图层或OpenGL,具体显示效果由迪文COF结构智能屏的显示材质所表现。QT上位机端可开发各种基于QLabel控件所显示的图案或图表,如仪表盘,折线图,AD采集曲线图,电子罗盘等。这里为了方便就只做了仪表盘和折线图,并且QT描绘的矢量图占用空间过大,导致刷屏速率和分辨率都很低,只能做两张200*200的矢量图,如果迪文厂家在后续扩充flash空间,则可配置更多类型的QT上位机图案或图表。
在DGUS软件中添加两个显示控件,两个控件的起始坐标重叠,描述指针分别为0x1010和0x2020,内存地址分别为0x7FFE和0xBFFE,使用两个控件更改坐标交替显示图案和图表可以实现双缓冲效果。
使用到的QT上位机图案,仪表盘支持OpenGL加速,渐变图层显示。
仪表盘
折线图为矢量图表,可以任意描绘坐标点。本来打算做AD采集的波浪曲线图的,但是无奈矢量曲线图占用空间真的大,采集一帧600*400曲线图的JPG文件都达到了100K以上,只能用这种显示内容简单的折线图。
仪表盘和折线图内容均取自QT上位机,可以在上面做基于XML或QTWidget套件操作,因为懒得造轮子,又想显示的内容够精美,只能出此上策!
原计划是打算显示AD采集曲线的,但是这个矢量图的占用空间是真的大,没写一点点进去就已经刷满GRAM了:
QT代码中抓取单个LABEL标签为JPG文件,并将JPG文件分片通过串口上传到GRAM: void MainWindow:n_PB_GRAB_clicked() { int res = 0; unsigned char recvbuf[6] ={0}; unsigned char commbuf[246] = {0x5a , 0xa5 , 0xf3 , 0x82};
unsigned short word_offset = 0x8000;
。。。
IF(fileName.isEmpty()) { QMessageBox mesg; mesg.warning(this,"警告","打开图片失败!"); return; } else { QFile file(fileName); QImage img(fileName); file.open(QIODevice::ReadOnly);
while(1) { memset(commbuf , 0 , 246); commbuf[0] = 0x5a; commbuf[1] = 0xa5; commbuf[2] = 0xf3; commbuf[3] = 0x82; commbuf[4] = ( word_offset & 0xff00 ) >> 8; commbuf[5] = word_offset & 0xff;
res = file.read((char*)commbuf + 6 , 240); if(res < 240) { qdebug("res = %d eof" , res); break; } else { word_offset += 0x78; }
QString qscommbuf; for(int n = 0 ; n < sizeof(commbuf); n++) { qscommbuf += QString().sprintf("%02x", (unsigned char)commbuf[n]); } qDebug()<<"res =" << res << qscommbuf;
res = commt->sendMyComm(commbuf , 246); qDebug()<<"ressend =" << res; } file.close(); } } void MainWindow:n_PB_GRAB_2_clicked() { int res = 0; unsigned char recvbuf[6] ={0}; unsigned char commbuf[246] = {0x5a , 0xa5 , 0xf3 , 0x82};
unsigned short word_offset = 0xC000;
。。。
if(fileName.isEmpty()) { QMessageBox mesg; mesg.warning(this,"警告","打开图片失败!"); return; } else { QFile file(fileName); QImage img(fileName); file.open(QIODevice::ReadOnly);
while(1) { memset(commbuf , 0 , 246); commbuf[0] = 0x5a; commbuf[1] = 0xa5; commbuf[2] = 0xf3; commbuf[3] = 0x82; commbuf[4] = ( word_offset & 0xff00 ) >> 8; commbuf[5] = word_offset & 0xff;
res = file.read((char*)commbuf + 6 , 240); if(res < 240) { qDebug("res = %d eof" , res); break; } else { word_offset += 0x78; }
QString qscommbuf; for(int n = 0 ; n < sizeof(commbuf); n++) { qscommbuf += QString().sprintf("%02x", (unsigned char)commbuf[n]); } qDebug()<<"res =" << res << qscommbuf;
res = commt->sendMyComm(commbuf , 246); qDebug()<<"ressend =" << res; } file.close(); } }
更改显示坐标,实际上就是切换隐藏或显示图案: void MainWindow:n_PB_MOVE_11_clicked() { unsigned char commbuf[246] = {0x5A , 0xA5 , 0x07 , 0x82 , 0x10 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00}; int res = commt->sendMyComm(commbuf , 10); qDebug()<<"ressendshow =" << res; } void MainWindow:n_PB_MOVE_12_clicked() { unsigned char commbuf[246] = {0x5A , 0xA5 , 0x07 , 0x82 , 0x10 , 0x11 , 0x02 , 0xd0 , 0x02 , 0xd0}; int res = commt->sendMyComm(commbuf , 10); qDebug()<<"ressendshow =" << res; } void MainWindow:n_PB_MOVE_21_clicked() { unsigned char commbuf[246] = {0x5A , 0xA5 , 0x07 , 0x82 , 0x20 , 0x21 , 0x00 , 0x00 , 0x00 , 0x00}; int res = commt->sendMyComm(commbuf , 10); qDebug()<<"ressendshow =" << res; } void MainWindow:n_PB_MOVE_22_clicked() { unsigned char commbuf[246] = {0x5A , 0xA5 , 0x07 , 0x82 , 0x20 , 0x21 , 0x02 , 0xd0 , 0x02 , 0xd0}; int res = commt->sendMyComm(commbuf , 10); qDebug()<<"ressendshow =" << res; }
循环显示: void MainWindow:n_PB_GRAB_3_clicked() { on_PB_MOVE_22_clicked(); on_PB_MOVE_12_clicked();
while(1) { on_PB_GRAB_clicked(); on_PB_MOVE_11_clicked(); on_PB_GRAB_2_clicked(); on_PB_MOVE_21_clicked(); Sleep(2000); on_PB_MOVE_22_clicked(); } }
|