emWin任务的具体实现(在MainTask.c文件里面):
复制代码
#include "MainTask.h"
#include "includes.h"
/*
*********************************************************************************************************
* 调用外部字体
*********************************************************************************************************
*/
extern GUI_CONST_STORAGE GUI_FONT GUI_FontSong16;
/*
*********************************************************************************************************
* 定义XBF格式字体
*********************************************************************************************************
*/
/* 宋体16点阵定义 */
#define XBF_Font16BaseAdd 0x00000000
GUI_XBF_DATA XBF_Data16;
GUI_FONT XBF_Font16;
void *Fontfile16;
/* 宋体24点阵定义 */
#define XBF_Font24BaseAdd 0x0015B7B6
GUI_XBF_DATA XBF_Data24;
GUI_FONT XBF_Font24;
void *Fontfile24;
/* 宋体32点阵定义 */
#define XBF_Font32BaseAdd 0x003CEF64
GUI_XBF_DATA XBF_Data32;
GUI_FONT XBF_Font32;
void *Fontfile32;
uint8_t tempbuf[4096]; /* 从SD卡读取数据的缓冲 */
/*
*********************************************************************************************************
* 函 数 名: _cbGetData16
* 功能说明: XBF字体的回调函数, 16点阵
* 形 参: Off - 地址偏移
* NumBytes - 需要读出的字节数
* pVoid - 指针变量,一般用于带文件系统时的FIL类型变量
* pBuffer - 获取字体的点阵数据
* 返 回 值: 0 表示成功 1 表示失败
*********************************************************************************************************
*/
static int _cbGetData16(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
{
/* 读取点阵数据 */
sf_ReadBuffer(pBuffer, XBF_Font16BaseAdd + Off, NumBytes);
return 0;
}
/*
*********************************************************************************************************
* 函 数 名: _cbGetData24
* 功能说明: XBF字体的回调函数, 24点阵
* 形 参: Off - 地址偏移
* NumBytes - 需要读出的字节数
* pVoid - 指针变量,一般用于带文件系统时的FIL类型变量
* pBuffer - 获取字体的点阵数据
* 返 回 值: 0 表示成功 1 表示失败
*********************************************************************************************************
*/
static int _cbGetData24(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
{
/* 读取点阵数据 */
sf_ReadBuffer(pBuffer, XBF_Font24BaseAdd + Off, NumBytes);
return 0;
}
/*
*********************************************************************************************************
* 函 数 名: _cbGetData32
* 功能说明: XBF字体的回调函数, 32点阵
* 形 参: Off - 地址偏移
* NumBytes - 需要读出的字节数
* pVoid - 指针变量,一般用于带文件系统时的FIL类型变量
* pBuffer - 获取字体的点阵数据
* 返 回 值: 0 表示成功 1 表示失败
*********************************************************************************************************
*/
static int _cbGetData32(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
{
/* 读取点阵数据 */
sf_ReadBuffer(pBuffer, XBF_Font32BaseAdd + Off, NumBytes);
return 0;
}
/*
*********************************************************************************************************
* 函 数 名: GUI_SetXBF
* 功能说明: 创建XBF字体
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void GUI_SetXBF(void)
{
/* 创建16点阵字体 */
GUI_XBF_CreateFont(&XBF_Font16, /* GUI_FONT类型变量 */
&XBF_Data16, /* GUI_XBF_DATA类型变量 */
GUI_XBF_TYPE_PROP, /* 字体类型 */
_cbGetData16, /* 回调函数 */
&Fontfile16); /* 回调函数参数 */
/* 创建24点阵字体 */
GUI_XBF_CreateFont(&XBF_Font24, /* GUI_FONT类型变量 */
&XBF_Data24, /* GUI_XBF_DATA类型变量 */
GUI_XBF_TYPE_PROP, /* 字体类型 */
_cbGetData24, /* 回调函数 */
&Fontfile24); /* 回调函数参数 */
/* 创建32点阵字体 */
GUI_XBF_CreateFont(&XBF_Font32, /* GUI_FONT类型变量 */
&XBF_Data32, /* GUI_XBF_DATA类型变量 */
GUI_XBF_TYPE_PROP, /* 字体类型 */
_cbGetData32, /* 回调函数 */
&Fontfile32); /* 回调函数参数 */
}
/*
*********************************************************************************************************
* 对话框信息
*********************************************************************************************************
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "安富莱电子", 0, 0, 0, 480, 272,FRAMEWIN_CF_MOVEABLE, 0},
{ BUTTON_CreateIndirect, "安富莱电子", GUI_ID_BUTTON0, 10, 150, 400, 50, 0, 0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-16点阵半角全角", GUI_ID_TEXT1, 0, 40, 480, 33, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-24点阵半角全角", GUI_ID_TEXT2, 0, 70, 480, 72, 0,0},
{ TEXT_CreateIndirect, "安富莱电子AaAa-32点阵半全角", GUI_ID_TEXT3, 0, 100, 480, 72, 0,0},
};
/*
*********************************************************************************************************
* 函 数 名: PaintDialog
* 功能说明: 重绘
* 形 参:pMsg 消息指针
* 返 回 值: 无
*********************************************************************************************************
*/
void PaintDialog(WM_MESSAGE * pMsg)
{
}
/*
*********************************************************************************************************
* 函 数 名: InitDialog
* 功能说明: 对话框初始化
* 形 参: pMsg 消息指针
* 返 回 值: 无
*********************************************************************************************************
*/
void InitDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
//
// 框架窗口设置
//
FRAMEWIN_SetFont(hWin,&XBF_Font24);
FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
FRAMEWIN_SetTitleHeight(hWin,35);
//
// 按钮控件设置
//
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&XBF_Font32);
//
// 文本控件设置
//
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1), GUI_RED);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT1),&XBF_Font16);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2), GUI_BLUE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT2),&XBF_Font24);
TEXT_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_TEXT3), GUI_ORANGE);
TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXT3),&XBF_Font32);
}
/*
*********************************************************************************************************
* 函 数 名: _cbCallback
* 功能说明: 对话框回调函数
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void _cbCallback(WM_MESSAGE * pMsg)
{
int NCode, Id;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_PAINT:
PaintDialog(pMsg);
break;
case WM_INIT_DIALOG:
InitDialog(pMsg);
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_ESCAPE:
GUI_EndDialog(hWin, 1);
break;
case GUI_KEY_ENTER:
GUI_EndDialog(hWin, 0);
break;
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id)
{
case GUI_ID_OK:
if(NCode==WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin, 0);
break;
case GUI_ID_CANCEL:
if(NCode==WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin, 0);
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
/*
*********************************************************************************************************
* 函 数 名: LoadFontLib()
* 功能说明: 从SD卡中加载字库文件到SPI FLASH
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void LoadFontLib(void)
{
float FinishPecent;
uint32_t Count = 0;
uint16_t y, i;
uint8_t ucState;
char cDispBuf[32];
/* 清屏 */
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
/* 设置字体 */
GUI_SetFont(&GUI_FontSong16);
y = 0;
/* 第1步:显示操作说明 ***************************************************************/
GUI_DispStringAt("SPI FLASH中存储字库实验", 0, y);
y += 16;
GUI_DispStringAt("1. 使用前保证SD卡中已经放入字库文件font.bin", 0, y);
y += 16;
GUI_DispStringAt("2. SD卡中不放入字库文件,无法将其复制到板载SPI FLASH中", 0, y);
y += 16;
/* 等待10s后开始进行复制,方便客户看屏幕上的显示信息 */
for(i = 0; i < 11; i++)
{
sprintf(cDispBuf, "3. 10秒后开始复制, 还剩余%d秒 ", 10 - i);
GUI_DispStringAt(cDispBuf, 0, y);
GUI_Delay(1000);
}
y += 16;
/* 第2步:打开文件 ***************************************************************/
result = f_open(&file, "font.bin", FA_OPEN_EXISTING | FA_READ);
if (result != FR_OK)
{
GUI_DispStringAt("font.bin文件打开失败", 0, y);
y += 16;
}
/* 第3步:复制SD卡中字库文件font.bin到SPI FLASH **********************************/
for(;;)
{
/* 读取一个扇区的数据到buf */
result = f_read(&file, &tempbuf, g_tSF.PageSize, &bw);
/* 读取出错或者读取完毕,退出 */
if ((result != FR_OK)||bw == 0)
{
break;
}
/* 写数据到SPI FLASH */
ucState = sf_WriteBuffer(tempbuf, Count*g_tSF.PageSize, g_tSF.PageSize);
/* 如果返回0,表示复制失败 */
if(ucState == 0)
{
GUI_DispStringAt("复制失败 ", 0, y);
break;
}
/* 显示复制进度 */
Count = Count + 1;
FinishPecent = (float)(Count* g_tSF.PageSize) / file.fsize;
sprintf(cDispBuf, "当前完成复制:%02d%%", (uint8_t)(FinishPecent*100));
GUI_DispStringAt(cDispBuf, 0, y);
}
/* 等待1秒后开始进去emWin主界面 */
GUI_Delay(1000);
}
/*
*********************************************************************************************************
* 函 数 名: MainTask
* 功能说明: GUI主函数
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void MainTask(void)
{
/* 初始化 */
GUI_Init();
/*
关于多缓冲和窗口内存设备的设置说明
1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
WM_MULTIBUF_Enable(1);
2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
4. 所有emWin例子默认是开启三缓冲。
*/
WM_MULTIBUF_Enable(1);
/*
触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
*/
//TOUCH_Calibration();
/* 使能UTF-8编码 */
GUI_UC_SetEncodeUTF8();
/* 将字库从SD卡中加载到SP FLASH里面,加载一次即可,以后使用注释掉此函数 */
LoadFontLib();
/* 创建XBF字体 */
GUI_SetXBF();
/* 调用此函数会自动的刷新桌面窗口 */
WM_SetDesktopColor(GUI_BLUE);
/* 创建对话框 */
GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
while(1)
{
GUI_Delay(10);
}
} |