迪文科技论坛

 找回密码
 立即注册
搜索
查看: 638|回复: 0

【开源】COF案例分享:基于迪文屏和QT上位机的图表远程监控

[复制链接]

574

主题

169

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12353
发表于 2022-4-26 14:07:54 | 显示全部楼层 |阅读模式
——文档转载自电子发烧友

使用迪文COF结构智能屏及其串口通信接口,结合电脑端QT上位机进行基于串口通信的上位机的图表远程监控界面。图案完全由QT上位机DIY定制,省去造轮子,可以使用QT上位机的高级GUI控件如渐变图层或OpenGL,具体显示效果由迪文COF结构智能屏的显示材质所表现。QT上位机端可开发各种基于QLabel控件所显示的图案或图表,如仪表盘,折线图,AD采集曲线图,电子罗盘等。这里为了方便就只做了仪表盘和折线图,并且QT描绘的矢量图占用空间过大,导致刷屏速率和分辨率都很低,只能做两张200*200的矢量图,如果迪文厂家在后续扩充flash空间,则可配置更多类型的QT上位机图案或图表。

DGUS软件中添加两个显示控件,两个控件的起始坐标重叠,描述指针分别为0x10100x2020,内存地址分别为0x7FFE0xBFFE,使用两个控件更改坐标交替显示图案和图表可以实现双缓冲效果。





使用到的QT上位机图案,仪表盘支持OpenGL加速,渐变图层显示。


仪表盘

折线图为矢量图表,可以任意描绘坐标点。本来打算做AD采集的波浪曲线图的,但是无奈矢量曲线图占用空间真的大,采集一帧600*400曲线图的JPG文件都达到了100K以上,只能用这种显示内容简单的折线图。




仪表盘和折线图内容均取自QT上位机,可以在上面做基于XMLQTWidget套件操作,因为懒得造轮子,又想显示的内容够精美,只能出此上策!



原计划是打算显示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();
        }
}












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-1-14 21:22 , Processed in 0.068636 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表