硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1233|回复: 1
收起左侧

[ThreadX全家桶] ThreadX GUIX实现摄像头图像动态更新的关键说明

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2022-1-10 01:10:03 | 显示全部楼层 |阅读模式
完整例子下(第29章及其配套例子):
https://www.armbbs.cn/forum.php?mod=viewthread&tid=98429
实现框图:


QQ截图20220110010845.png


摄像头传输完成中断发消息:
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: CAM_Stop
  4. *        功能说明: 停止DMA和DCMI
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. #include   "gx_api.h"
  10. GX_EVENT event;

  11. void CAM_Stop(void)
  12. {
  13.         HAL_DCMI_Stop(&hdcmi);
  14. }

  15. void DMA1_Stream7_IRQHandler(void)
  16. {
  17.         HAL_DMA_IRQHandler(&hdma_dcmi);
  18. }

  19. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
  20. {
  21.         /* 关闭摄像 */
  22.         CAM_Stop();
  23.     event.gx_event_type = 0x40000000;
  24.     gx_system_event_send(&event);
  25.         g_tCam.CaptureOk = 1;                /* 表示DMA传输结束 */
  26. }
复制代码


回调消息里面设置局部Dirty,触发重绘:
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: _cbEventWindow
  4. *        功能说明: 窗口window的事件回调函数
  5. *        形    参: widget     窗口句柄
  6. *             event_ptr  事件指针
  7. *        返 回 值: 返回0表示成功
  8. *********************************************************************************************************
  9. */
  10. UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr)
  11. {

  12.     switch (event_ptr->gx_event_type)
  13.     {
  14.         /* 控件显示事件 */
  15.         case GX_EVENT_SHOW:

  16.             /* 默认事件处理 */
  17.             gx_window_event_process(widget, event_ptr);
  18.             break;

  19.         /* 接收到摄像头图像数据 */
  20.         case 0x40000000:
  21.             /* 设置窗口dirty,这样会触发窗口更新 */
  22.             gx_system_dirty_partial_add(widget, &WinPartialDraw);
  23.             break;

  24.         default:
  25.             return gx_window_event_process(widget, event_ptr);
  26.     }

  27.     return 0;
  28. }
复制代码


重绘代码实现:
  1. /* 摄像头图像绘制区 */
  2. GX_RECTANGLE WinPartialDraw =  {0, 0, 640, 480};

  3. /* 摄像头位图定义 */
  4. GX_PIXELMAP CAMREA_pixelmap =
  5. {
  6.     0x00000001,                              /* major version                  */
  7.     0x00000000,                              /* minor version                  */
  8.     0,                                       /* flags                          */
  9.     GX_COLOR_FORMAT_565RGB,                  /* Format                         */
  10.     (GX_UBYTE *) 0,
  11.     640*480*2,    /* the size of pixelmap_data*/
  12.     NULL,
  13.     0,                                       /* auxiliary data size            */
  14.     0x00,                                    /* used for transparent iamges    */
  15.     640,                                     /* width in pixel                 */
  16.     480                                      /* height in pixel                */
  17. };

  18. /*
  19. *********************************************************************************************************
  20. *        函 数 名: _cbWindow0
  21. *        功能说明: 窗口window的绘制回调函数
  22. *        形    参: widget     窗口句柄
  23. *        返 回 值: 无
  24. *********************************************************************************************************
  25. */
  26. VOID _cbWindow0(GX_WINDOW *widget)
  27. {
  28.     GX_RECTANGLE drawto;  
  29.     GX_CANVAS *mycanvas;
  30.    
  31.     /* 默认的窗口绘制回调函数,即默认界面效果绘制 */
  32.     gx_window_draw(widget);

  33.     /* 定义一个矩形框,后续的2D绘制函数都是在这个矩形范围内绘制的 */
  34.     gx_utility_rectangle_define(&drawto,
  35.                                WinPartialDraw.gx_rectangle_left,
  36.                                 WinPartialDraw.gx_rectangle_top,
  37.                                 WinPartialDraw.gx_rectangle_right,
  38.                                 WinPartialDraw.gx_rectangle_bottom);

  39.     /* 返回窗口对应的canvas画布 */
  40.     gx_widget_canvas_get(widget, &mycanvas);
  41.    
  42.    
  43.     /*
  44.       在指定的画布上启动绘图。此功能在内部被延迟绘图算法调用,GUIX在需要画布时自动执行更新。
  45.       但是允许应用程序绕过延期绘图算法并立即执行。
  46.       首先调用gx_canvas_drawing_inititate在画布上绘画。
  47.       然后调用所需的绘图函数,然后调用gx_canvas_drawing_complete即可。
  48.     */
  49.     gx_canvas_drawing_initiate(mycanvas, widget, &drawto);
  50.        
  51.     gx_canvas_pixelmap_draw( WinPartialDraw.gx_rectangle_left,  WinPartialDraw.gx_rectangle_top, &CAMREA_pixelmap);

  52.     /* 用于强制立即绘制,注意,务必和gx_canvas_drawing_initiate成对调用 */
  53.     gx_canvas_drawing_complete(mycanvas, GX_TRUE);
  54.    
  55.     /* 更新完毕开启下一帧 */
  56.     CAM_Start1(SDRAM_CAMERA);
  57. }
复制代码


回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2022-1-10 09:06:51 | 显示全部楼层
我之前用函数 gx_system_event_send发送过一次,愣是没成功。
代码不规范,亲人两行泪!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 08:53 , Processed in 0.517028 second(s), 35 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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