硬汉嵌入式论坛

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

[emWin] H7使用emwin5.44无法旋转屏幕

[复制链接]

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2023-2-1 14:03:16 | 显示全部楼层 |阅读模式
本帖最后由 454234682 于 2023-2-1 14:05 编辑

H7使用emwin5.44无法旋转屏幕,竖屏显示一切正常,切换到横屏模式就显示乱码了屏幕是无法硬件旋转的,只能通过软件实现,有点搞不懂emwin的实现方式。

横屏乱码

横屏乱码

竖屏正常

竖屏正常

下面是内存大小,使用的3缓冲。
#define GUI_NUMBYTES  (1024) * 8192*2 //8192

#define NUM_BUFFERS      3 /* Number of multiple buffers to be used */
#define NUM_VSCREENS     1 /* Number of virtual screens to be used */





回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-2-1 14:10:22 | 显示全部楼层
因为我需要显示图片旋转的动画效果,所以使用的内存设备,然后发现
使用GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_X);设置屏幕旋转后
必须要WM_EnableMemdev(WM_HBKWIN);
这样横屏就能显示画面了,但是问题是图片显示很卡,竖屏刷新需要60ms,横屏竟然要超过560ms。
[C] 纯文本查看 复制代码
  GUI_Init();

	GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_X);

  /* Enable multibuffering for memory device animation */
  GUI_MEMDEV_MULTIBUF_Enable(1);
	
	/* Enable Window Manager Multibuffering */
  //WM_MULTIBUF_Enable(1);

#if GUI_SUPPORT_MEMDEV
  WM_SetCreateFlags(WM_CF_MEMDEV);
#endif
  WM_EnableMemdev(WM_HBKWIN);
	
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-2-1 15:20:28 | 显示全部楼层
刷新的多大图片,emWin的输出颜色格式是配置的565吧

60ms有点慢,要搞到10ms以内,使用存储设备绘制方式,就是把你的图片绘制到存储设备里面,然后调用存储设备的API刷新。

回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-2-2 09:17:20 | 显示全部楼层
eric2013 发表于 2023-2-1 15:20
刷新的多大图片,emWin的输出颜色格式是配置的565吧

60ms有点慢,要搞到10ms以内,使用存储设备绘制方式 ...

1、输出是565
[C] 纯文本查看 复制代码
#define COLOR_CONVERSION_0    GUICC_M565 
#define DISPLAY_DRIVER_0      GUIDRV_LIN_16         

2、我用了多个内存设备,图片和网格都是创建的不同的内存设备,然后在统一显示出来
[C] 纯文本查看 复制代码
static void _cbViewWin1(WM_MESSAGE * pMsg) {
	WM_HWIN     hWin;
	hWin = pMsg->hWin;

	int NCode, Id;
	static GUI_RECT Rect;
	static int xPos, yPos;
	static int xSize, ySize;
	GUI_MEMDEV_Handle hMemOld;
	static WM_HTIMER hTimerTime;

	static WM_HWIN hText[4] = { 0 };

	static int x = 100;
	static int y = 100;
	static short h_old = 0;
	static short a_old = 360;
	static short l_old = 0;
	
	//U32 start,end;

	switch (pMsg->MsgId)
	{
	case WM_PAINT:
		WM_GetClientRect(&Rect);

		//start = osKernelSysTick();
	
		//GUI_SetBkColor(GUI_MAKE_COLOR(0xA98133));//0xC9A133
		//GUI_Clear();
		xPos = WM_GetWindowOrgX(hWin);
		yPos = WM_GetWindowOrgY(hWin);

		hMemOld = GUI_MEMDEV_Select(hLCD);
		/**/
		//GUI_MEMDEV_RotateHQ(pImage->hMem,
		//					hDst,
		//					100,
		//					100,
		//					30 * 1000,
		//					1*1000);
		//GUI_SetColor(GUI_RED);
		//GUI_DrawRect(0, 0, GUI_MEMDEV_GetXSize(hLCD) - 1, GUI_MEMDEV_GetYSize(hLCD) - 1);
		GUI_DrawRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);

		//GUI_MEMDEV_Write(hDst);
		GUI_MEMDEV_WriteAt(hDst, xPos+1, yPos+1);
		//GUI_MEMDEV_WriteAt(pImage->hMem, x, 100);
		//GUI_MEMDEV_WriteAlphaAt(pImage->hMem, 255, 100, 100);
		//GUI_DrawBitmap(&bmPT, x, 200);
		//GUI_SetBkColor(GUI_RED);
		//GUI_Clear();
		//GUI_MEMDEV_WriteAt(pImage->hMem, x, 100);
		GUI_MEMDEV_Rotate(pImage->hMem, hLCD, x, 100, a_old * 1000, 1000);

		GUI_DrawBitmap(&bmalarm, LCD_GetXSize()-76, 16);

		//GUI_MEMDEV_Select(0);
		/* Display the result on the screen */
		//GUI_MULTIBUF_Begin();
		//GUI_MEMDEV_CopyToLCDAt(hDst, 0, 0);
		//GUI_MULTIBUF_End();
		//GUI_MEMDEV_CopyToLCD(pImage->hMem);

		GUI_MEMDEV_Select(hMemOld);
		//GUI_MEMDEV_WriteAt(hDst, 0, 32);
		//GUI_MEMDEV_CopyToLCDAt(hLCD, 0, yPos);
		GUI_MEMDEV_WriteAt(hLCD, 0, yPos);
//		GUI_MEMDEV_WriteAt(hDst, xPos+1, yPos+1);

		//GUI_MEMDEV_WriteAt(pImage->hMem, 0, yPos);

		//end = osKernelSysTick();
		//printf("time :%d\r\n",end - start);
		break;

	case WM_TIMER:
		if (x++ > 400)x = 100;
		a_old -= 10;
		if (a_old <= 0)a_old = 360;
		WM_InvalidateWindow(hWin);
		WM_RestartTimer(pMsg->Data.v, 0);
		break;

	case WM_CREATE:
		/**/
		WM_GetClientRect(&Rect);

		hTimerTime = WM_CreateTimer(hWin, 0, 100, 0);

		/*******************************************************************************************************/
		pImage = &_aImage[0];

		/* Get the picture sizes */
		pImage->xSize = pImage->pBitmap->XSize;
		pImage->ySize = pImage->pBitmap->YSize;
		/* Allocate the needed memdev pictures */
		pImage->hMem = GUI_MEMDEV_CreateFixed(0,
												0,
												pImage->xSize,
												pImage->ySize,
												GUI_MEMDEV_HASTRANS,
												GUI_MEMDEV_APILIST_32,
												GUICC_M8888I);

		/* Select the memdev created and paint the picturte on it */
		GUI_MEMDEV_Select(pImage->hMem);
		GUI_SetBkColor(GUI_TRANSPARENT);
		GUI_Clear();
		GUI_DrawBitmap(&bmPT, 0, 0);
		/* Select the display after finishing the job */
		GUI_MEMDEV_Select(0);

		/* Display the result on the screen */
		//GUI_MULTIBUF_Begin();
		//		GUI_MEMDEV_CopyToLCD(pImage->hMem);
		//GUI_MULTIBUF_End();	

		/* Get the screen size */
		xPos = WM_GetWindowOrgX(hWin);
		yPos = WM_GetWindowOrgY(hWin);
		xSize = WM_GetWindowSizeX(hWin);// LCD_GetXSize();
		ySize = WM_GetWindowSizeY(hWin);// LCD_GetYSize();

//		printf("xSize:%d,ySize:%d\r\n", xSize, ySize);
		
		/* Exit if any issue when creating the memdev */
		hLCD = GUI_MEMDEV_CreateFixed(xPos,
										yPos,
										xSize,
										ySize,
										GUI_MEMDEV_HASTRANS,
										GUI_MEMDEV_APILIST_32,
										GUICC_M8888I);

		/* Select the display after finishing the job */
		GUI_MEMDEV_Select(0);

		//WM_GetClientRect(&Rect);
		/* Exit if any issue when creating the memdev */
		hDst = GUI_MEMDEV_CreateFixed(0,
										0,
										xSize-86,
										ySize-2,
										GUI_MEMDEV_HASTRANS,
										GUI_MEMDEV_APILIST_32,
										GUICC_M8888I);
#if 1
		/* Select the memdev created and paint the picturte on it */
		GUI_MEMDEV_Select(hDst);
		//GUI_SetBkColor(GUI_MAKE_COLOR(0xA98133));
		GUI_Clear();
		//GUI_DrawBitmap(&bmPT, 0, 0);
		//WM_GetClientRect(&Rect);
		//GUI_DrawRect(0, 0, GUI_MEMDEV_GetXSize(hDst) - 1, GUI_MEMDEV_GetYSize(hDst) - 1);
		
		//缂佹ê鍩楅崸鎰垼缁?
		xPos = GUI_MEMDEV_GetXPos(hDst) + 10;
		yPos = GUI_MEMDEV_GetYPos(hDst) + 10;// Rect.y1 / 2 - 48;
		xSize = GUI_MEMDEV_GetXSize(hDst) - xPos * 2;// 800 - 20;// Rect.x1 - 20;
		ySize = GUI_MEMDEV_GetYSize(hDst) - yPos * 2;// 480 - 60;// Rect.y1 - yPos - 10;
	
		//GUI_ClearRect(xPos, yPos, xPos + xSize, yPos + ySize);
		GUI_SetColor(GUI_BLACK);
		GUI_FillRect(xPos, yPos, /*xPos +*/ xSize, /*yPos +*/ ySize);
		//GUI_SetColor(GUI_GREEN);
		//GUI_DrawRect(xPos, yPos, xPos + xSize, yPos + ySize);
		GUI_SetColor(GUI_MAKE_COLOR(0x00005000));
		GUI_DrawRect(xPos, yPos, xPos + xSize, yPos + ySize);
		GUI_SetPenSize(1);
		GUI_SetLineStyle(GUI_LS_DOT);
		for (int i = 0; i < ySize / 10 + 1;i++)
			GUI_DrawHLine(yPos + ySize - 10 * i, xPos, xPos + xSize);
		for (int i = 0; i < xSize / 10 + 1; i++)
			GUI_DrawVLine(xPos + 10 * i, yPos, yPos + ySize);

		/*閸ф劖鐖*/
		GUI_SetColor(GUI_GREEN);
		GUI_SetLineStyle(GUI_LS_SOLID);
		GUI_DrawVLine(xPos + 10, yPos + 20, yPos + ySize - 20);
		GUI_DrawHLine(yPos + ySize - 20, xPos + 10, xPos + xSize - 20);
		GUI_DrawLine(xPos + 10, yPos + 20, xPos + 6, yPos + 24);
		GUI_DrawLine(xPos + 10, yPos + 20, xPos + 14, yPos + 24);
		GUI_DrawLine(xPos + xSize - 20, yPos + ySize - 20, xPos + xSize - 20 - 4, yPos + ySize - 24);
		GUI_DrawLine(xPos + xSize - 20, yPos + ySize - 20, xPos + xSize - 20 - 4, yPos + ySize - 16);
		/*閸掕瀹*/
		for (int i = 0; i < 6; i++){
			GUI_DrawHLine(yPos + ySize - 20 - 70 * i, xPos + 10, xPos + 14);
			//GUI_DrawVLine(xPos + 50 + 50 * i, yPos + ySize - 24, yPos + ySize - 20);
		}
		for (int i = 0; i < 7; i++){
			//GUI_DrawHLine(yPos + ySize - 40 - 50 * i, xPos + 10, xPos + 14);
			GUI_DrawVLine(xPos + 10 + 100 * i, yPos + ySize - 24, yPos + ySize - 20);
		}
		
		GUI_SetFont(&GUI_Font24_ASCII);
		GUI_SetTextMode(GUI_TM_TRANS);
		GUI_DispStringAt("0", xPos + 20, yPos + ySize - 100);
		GUI_DispStringAt("1000", xPos + 20, yPos + ySize - 170);
		GUI_DispStringAt("2000", xPos + 20, yPos + ySize - 240);
		GUI_DispStringAt("3000", xPos + 20, yPos + ySize - 310);
		GUI_DispStringAt("4000", xPos + 20, yPos + ySize - 380);

		GUI_DispStringAt("0", xPos + 104, yPos + ySize - 20);
		GUI_DispStringAt("200", xPos + 192, yPos + ySize - 20);																
		GUI_DispStringAt("400", xPos + 292, yPos + ySize - 20);
		GUI_DispStringAt("600", xPos + 392, yPos + ySize - 20);
		GUI_DispStringAt("800", xPos + 492, yPos + ySize - 20);
		GUI_DispStringAt("1000", xPos + 592, yPos + ySize - 20);

		//GUI_MEMDEV_WriteAt(hDst, 0, 0);
		//GUI_MEMDEV_WriteAlphaAt(pImage->hMem, 255, 0, 0);
		//GUI_DrawBitmap(&bmPT, 100, 100);

		/* Select the display after finishing the job */
		GUI_MEMDEV_Select(0);
#endif

//		xPos = 724;
//		yPos = 100;
//		xSize = 64;
//		ySize = 16;
//		hText[0] = TEXT_CreateEx(xPos, yPos, xSize, ySize, hWin, WM_CF_SHOW, TEXT_CF_LEFT, GUI_ID_TEXT0, "涓搧瑁呭");

//		yPos += ySize + 6;
//		hText[1] = TEXT_CreateEx(xPos, yPos, xSize, ySize, hWin, WM_CF_SHOW, TEXT_CF_LEFT, GUI_ID_TEXT0, "涓搧瑁呭");

//		yPos += ySize + 6;
//		hText[2] = TEXT_CreateEx(xPos, yPos, xSize, ySize, hWin, WM_CF_SHOW, TEXT_CF_LEFT, GUI_ID_TEXT0, "涓搧瑁呭");

//		yPos += ySize + 6;
//		hText[3] = TEXT_CreateEx(xPos, yPos, xSize, ySize, hWin, WM_CF_SHOW, TEXT_CF_LEFT, GUI_ID_TEXT0, "涓搧瑁呭");

//		for (int i = 0; i < 4; i++){
//			TEXT_SetFont(hText[i], &GUI_FontS16);
//			TEXT_SetTextColor(hText[i], GUI_WHITE);
//			TEXT_SetBkColor(hText[i], GUI_DARKGREEN);
//		}

		break;

	default:
		WM_DefaultProc(pMsg);
		}
}

回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-2-2 09:20:20 | 显示全部楼层
eric2013 发表于 2023-2-1 15:20
刷新的多大图片,emWin的输出颜色格式是配置的565吧

60ms有点慢,要搞到10ms以内,使用存储设备绘制方式 ...

最重要一个问题是,横屏模式必须要WM_EnableMemdev(WM_HBKWIN);才能正常显示画面,使用这条命令后刷新才会变得非常缓慢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-2-3 09:44:57 | 显示全部楼层
454234682 发表于 2023-2-2 09:20
最重要一个问题是,横屏模式必须要WM_EnableMemdev(WM_HBKWIN);才能正常显示画面,使用这条命令后刷新才 ...

是不是你的三缓存没有正常运行。有这个可能。
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-2-6 17:26:45 | 显示全部楼层
本帖最后由 454234682 于 2023-2-6 17:30 编辑
eric2013 发表于 2023-2-3 09:44
是不是你的三缓存没有正常运行。有这个可能。

缓存应该是正常的吧 微信图片_20230206172956.png
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-2-6 17:27:31 | 显示全部楼层
eric2013 发表于 2023-2-3 09:44
是不是你的三缓存没有正常运行。有这个可能。

回复怎么带图片啊,我竟然不会
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2023-2-6 17:27:51 | 显示全部楼层
image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-2-7 09:05:51 | 显示全部楼层
454234682 发表于 2023-2-2 09:17
1、输出是565
[mw_shl_code=c,true]#define COLOR_CONVERSION_0    GUICC_M565
#define DISPLAY_DRIVE ...

绘制方式跟没有使用存储设备的速度是一样的,你这里仅仅是解决了整体绘制问题。

在WM_PAINT里面不要做任何额外的操作,仅仅是绘制。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 03:04 , Processed in 0.212030 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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