硬汉嵌入式论坛

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

[emWin] EMWIN窗口不刷新

[复制链接]

26

主题

181

回帖

259

积分

高级会员

积分
259
发表于 2022-6-14 22:31:32 | 显示全部楼层 |阅读模式
系统是FREERTOS,屏用的SSD1306,显示区域分成了两部分,上面一小块做状态栏显示,是个子窗口,在回调中的EMWIN的软件定时器中让窗口无效来刷新屏幕,下方是一个WINDOW,也是用定时器来刷新显示。时间不定,设备可能几天,也可能几十天才不刷新,由于不容易出现此情况,没连接仿真器,所以不知道是什么原因。RTOS没死,其它外设工作都好好的,其它EMWIN界面都能调出来显示。状态栏和窗口都不刷新。


代码根据ST官方的示例改的。大概代码如下:

[C] 纯文本查看 复制代码
/*********************************************************************
*                                                                    *
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
*                                                                    *
**********************************************************************
*                                                                    *
* C-file generated by:                                               *
*                                                                    *
*        GUI_Builder for emWin version 5.44                          *
*        Compiled Nov 10 2017, 08:53:57                              *
*        (c) 2017 Segger Microcontroller GmbH & Co. KG               *
*                                                                    *
**********************************************************************
*                                                                    *
*        Internet: [url]www.segger.com[/url]  Support: [email]support@segger.com[/email]       *
*                                                                    *
**********************************************************************
*/

// USER START (Optionally insert additional includes)
#include "stdio.h"
#include "main.h"

// USER END

#include "DIALOG.h"

/*********************************************************************
*
*       Defines
*
**********************************************************************
*/
#define ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define ID_TEXT_0 (GUI_ID_USER + 0x01)


// USER START (Optionally insert additional defines)
extern GUI_CONST_STORAGE GUI_FONT GUI_FontKaiTi16;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontKaiTi24;
extern GUI_CONST_STORAGE GUI_FONT GUI_FontKaiTi33;
#define ID_SYSDESKTOP_TIMER_TIME                  (GUI_ID_USER + 0x9A)
//#define ID_TIMER_TIME                  1
extern WM_HWIN pWin;
extern WM_HWIN CurrenthWin;
extern WM_HWIN CreatePowerOff(void);

// USER END

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

// USER START (Optionally insert additional static data)
// USER END

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "SysDesktop", ID_WINDOW_0, 0, 12, 128, 52, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "", ID_TEXT_0, 0, 0, 128, 52, 0, 0x64, 0 },
  // USER START (Optionally insert additional widgets)
  // USER END
};

/*********************************************************************
*
*       Static code
*
**********************************************************************
*/

// USER START (Optionally insert additional static code)

// USER END

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of ''
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    TEXT_SetText(hItem, "X");
    // USER START (Optionally insert additional code for further widget initialization)
		hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
		TEXT_SetFont(hItem, &GUI_FontKaiTi24);

		TEXT_SetText(hItem, "T");

		WM_SetFocus(pMsg->hWin);

    // USER END
    break;
  // USER START (Optionally insert additional message handling)
		case GUI_KEY_POWERONOFF:
			
			CreatePowerOff();
		
		break;

		break;		
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
*       CreateSysDesktop
*/
WM_HWIN CreateSysDesktop(void);
WM_HWIN CreateSysDesktop(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

// USER START (Optionally insert additional public code)
/*******************************************************************
*
* Callback routine for foreground window
*
********************************************************************
*/
static void cbForegroundWin(WM_MESSAGE* pMsg) {
	switch (pMsg->MsgId) {
		case WM_PAINT:
			GUI_SetBkColor(GUI_BLACK);
			GUI_Clear();
			//GUI_DispString("Foreground window");
		break;
		default:
			WM_DefaultProc(pMsg);
	}
}
/*******************************************************************
*
* Callback routine for background window
*
********************************************************************
*/
static void _cbBackGround(WM_MESSAGE* pMsg) {	//桌面背景的回调函数
  int xSize, ySize;
  static uint8_t TempStr[50];
	uint16_t usage =0;
	
  RTC_TimeTypeDef   RTC_TimeStructure;
  RTC_DateTypeDef   RTC_DateStructure;
  uint8_t sec, min, hour;
  uint8_t day, month, year;
  
  static WM_HTIMER hTimerTime;
  WM_HWIN hWin,cWin;
	
  hWin = pMsg->hWin;
  switch (pMsg->MsgId) {

  case WM_CREATE:
    hTimerTime = WM_CreateTimer(hWin, ID_SYSDESKTOP_TIMER_TIME/*ID_TIMER_TIME*/, 1000, 0);
    break;
//  case WM_DELETE:
//    WM_DeleteTimer(hTimerTime);
//    break;
  case WM_TIMER:

    WM_InvalidateWindow(hWin);
    WM_RestartTimer(pMsg->Data.v, 1000);

    break;
 
  case WM_PAINT:
    xSize = WM_GetWindowSizeX(hWin);
    ySize = WM_GetWindowSizeY(hWin);
    
    /* Draw background */
    GUI_SetColor(GUI_WHITE);
    GUI_FillRect(0, 0, xSize , ySize - 3);
    GUI_SetColor(GUI_BLACK);
    GUI_DrawHLine(ySize - 2, 0, xSize );
    GUI_SetColor(GUI_WHITE);
    GUI_DrawHLine(ySize - 1, 0, xSize );
    
    /* Draw time & Date */
    GUI_SetTextMode(GUI_TM_TRANS);
    GUI_SetColor(GUI_BLACK);
    GUI_SetFont(GUI_FONT_8_ASCII);

		sprintf((char *)TempStr, "%02d\/%02d\/%02d %02d:%02d",
			DateTime.Date.Year, DateTime.Date.Month, DateTime.Date.Date,
		DateTime.Time.Hours , DateTime.Time.Minutes/*, DateTime.Time.Seconds*/);


    break;
    
  default:
    WM_DefaultProc(pMsg);
  }
}

WM_HWIN CreateSysDesktop1(void);
WM_HWIN CreateSysDesktop1(void) {
  WM_HWIN hWin;
	
	WM_SetCreateFlags(WM_CF_MEMDEV);	
	GUI_EnableAlpha(1);
	WM_MULTIBUF_Enable(1);
	WM_SetDesktopColor(GUI_BLACK);
	WM_EnableMemdev(WM_GetDesktopWindow());
	GUI_UC_SetEncodeUTF8();

  WM_CreateWindowAsChild(0,
                         0,
                         LCD_GetXSize(),
                         12,
                         //WM_HBKWIN, 
												 WM_GetDesktopWindow(),
                         WM_CF_SHOW /*| WM_CF_HASTRANS */, 
                         _cbBackGround, 
                         0); 
	
	hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);

  return hWin;
}

// USER END

/*************************** End of file ****************************/



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-6-15 11:13:10 | 显示全部楼层

  WM_SetCreateFlags(WM_CF_MEMDEV);   
    GUI_EnableAlpha(1);
    WM_MULTIBUF_Enable(1);

窗口存储设备和三缓冲,二选一,两个都定义会导致,之前版本实测,会导致仅存储设备起作用。


其它的地方要测试下程序才行。


回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2022-6-15 13:10:45 | 显示全部楼层
eric2013 发表于 2022-6-15 11:13
WM_SetCreateFlags(WM_CF_MEMDEV);   
    GUI_EnableAlpha(1);
    WM_MULTIBUF_Enable(1);

意思是只需要WM_SetCreateFlags(WM_CF_MEMDEV);        就可以了?搞不懂,为什么定时器中途会挂掉。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115863
QQ
发表于 2022-6-17 11:19:39 | 显示全部楼层
ccschen 发表于 2022-6-15 13:10
意思是只需要WM_SetCreateFlags(WM_CF_MEMDEV);        就可以了?搞不懂,为什么定时器中途会挂掉。。。

修改后解决了吗
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2022-6-18 11:07:27 | 显示全部楼层

很难说,目前没出,即使要出问题,也不知道什么时候出了,这个不像那种随时可复现的问题。反正现在老化起的。       
现在只用了MEMDEV那个。
现在都在定时器里面这样干了。
WM_InvalidateWindow(WM_GetClientWindow(pMsg->hWin));
/* Refrish real time display */   
WM_InvalidateWindow(pMsg->hWin);

然后新建定时器都是在case WM_INIT_DIALOG:里面建立的。       

然后现在在弄FREERTOS+GUIX,OLED,SPI,可想而知306,GUI的定时器和任务都在运行,屏幕上就是不出主界面。这样时间成本最小。之前是FREERTOS+STEMWIN.
反正想多个方案做备份,修改后需要长时间测试,不知道什么时候会出问题。。
回复

使用道具 举报

26

主题

181

回帖

259

积分

高级会员

积分
259
 楼主| 发表于 2022-6-18 14:08:52 | 显示全部楼层
很好,GUIX主界面出来了。。。哈哈哈。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-24 03:49 , Processed in 0.219474 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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