|
完整例子下(第29章及其配套例子):
https://www.armbbs.cn/forum.php?mod=viewthread&tid=98429
实现框图:
摄像头传输完成中断发消息:
- /*
- *********************************************************************************************************
- * 函 数 名: CAM_Stop
- * 功能说明: 停止DMA和DCMI
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- #include "gx_api.h"
- GX_EVENT event;
- void CAM_Stop(void)
- {
- HAL_DCMI_Stop(&hdcmi);
- }
- void DMA1_Stream7_IRQHandler(void)
- {
- HAL_DMA_IRQHandler(&hdma_dcmi);
- }
- void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
- {
- /* 关闭摄像 */
- CAM_Stop();
- event.gx_event_type = 0x40000000;
- gx_system_event_send(&event);
- g_tCam.CaptureOk = 1; /* 表示DMA传输结束 */
- }
复制代码
回调消息里面设置局部Dirty,触发重绘:
- /*
- *********************************************************************************************************
- * 函 数 名: _cbEventWindow
- * 功能说明: 窗口window的事件回调函数
- * 形 参: widget 窗口句柄
- * event_ptr 事件指针
- * 返 回 值: 返回0表示成功
- *********************************************************************************************************
- */
- UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr)
- {
- switch (event_ptr->gx_event_type)
- {
- /* 控件显示事件 */
- case GX_EVENT_SHOW:
- /* 默认事件处理 */
- gx_window_event_process(widget, event_ptr);
- break;
- /* 接收到摄像头图像数据 */
- case 0x40000000:
- /* 设置窗口dirty,这样会触发窗口更新 */
- gx_system_dirty_partial_add(widget, &WinPartialDraw);
- break;
- default:
- return gx_window_event_process(widget, event_ptr);
- }
- return 0;
- }
复制代码
重绘代码实现:
- /* 摄像头图像绘制区 */
- GX_RECTANGLE WinPartialDraw = {0, 0, 640, 480};
- /* 摄像头位图定义 */
- GX_PIXELMAP CAMREA_pixelmap =
- {
- 0x00000001, /* major version */
- 0x00000000, /* minor version */
- 0, /* flags */
- GX_COLOR_FORMAT_565RGB, /* Format */
- (GX_UBYTE *) 0,
- 640*480*2, /* the size of pixelmap_data*/
- NULL,
- 0, /* auxiliary data size */
- 0x00, /* used for transparent iamges */
- 640, /* width in pixel */
- 480 /* height in pixel */
- };
- /*
- *********************************************************************************************************
- * 函 数 名: _cbWindow0
- * 功能说明: 窗口window的绘制回调函数
- * 形 参: widget 窗口句柄
- * 返 回 值: 无
- *********************************************************************************************************
- */
- VOID _cbWindow0(GX_WINDOW *widget)
- {
- GX_RECTANGLE drawto;
- GX_CANVAS *mycanvas;
-
- /* 默认的窗口绘制回调函数,即默认界面效果绘制 */
- gx_window_draw(widget);
- /* 定义一个矩形框,后续的2D绘制函数都是在这个矩形范围内绘制的 */
- gx_utility_rectangle_define(&drawto,
- WinPartialDraw.gx_rectangle_left,
- WinPartialDraw.gx_rectangle_top,
- WinPartialDraw.gx_rectangle_right,
- WinPartialDraw.gx_rectangle_bottom);
-
- /* 返回窗口对应的canvas画布 */
- gx_widget_canvas_get(widget, &mycanvas);
-
-
- /*
- 在指定的画布上启动绘图。此功能在内部被延迟绘图算法调用,GUIX在需要画布时自动执行更新。
- 但是允许应用程序绕过延期绘图算法并立即执行。
- 首先调用gx_canvas_drawing_inititate在画布上绘画。
- 然后调用所需的绘图函数,然后调用gx_canvas_drawing_complete即可。
- */
- gx_canvas_drawing_initiate(mycanvas, widget, &drawto);
-
- gx_canvas_pixelmap_draw( WinPartialDraw.gx_rectangle_left, WinPartialDraw.gx_rectangle_top, &CAMREA_pixelmap);
- /* 用于强制立即绘制,注意,务必和gx_canvas_drawing_initiate成对调用 */
- gx_canvas_drawing_complete(mycanvas, GX_TRUE);
-
- /* 更新完毕开启下一帧 */
- CAM_Start1(SDRAM_CAMERA);
- }
复制代码
|
|