系统功能
添加UI页面文件
运行脚本src/template/uiPageCreate.py。
按提示选择新增页面文件,输入页面名称,例如demo。
按回车后,在当前目录下生成文件夹uiPageOutput,里边包含所需要的文件uiDemo.c、uiDemo.h、uiDemoLogic.c、uiDemoLogic.h。
将文件导入项目中,main.c中添加头文件uiDemo.h。
在main函数中添加ldGuiInit(&uiDemoFunc);,进行设定启动页面。
#include "uiDemo.h" int main(void) { sysInit(); arm_irq_safe { arm_2d_init(); } disp_adapter0_init(); ldGuiInit(&uiDemoFunc); while(1) { disp_adapter0_task(); } }
生成图片字模数据
tools文件夹中有工具生成数据
📖 使用说明 tools/README.md
功能库
btnAction 按键处理
这是一个独立的多功能按键库,可以对GUI按键和实体按键进行行为检测。
信号
该库可以检测以下信号
| 信号 | 说明 |
|---|---|
| BTN_PRESS | 按下 |
| BTN_HOLD_DOWN | 按住不放 |
| BTN_RELEASE | 释放 |
| BTN_DOUBLE_CLICK | 双击 |
| BTN_REPEAT_COUNT | 获取连击次数 |
| BTN_HOLD_TIME | 按住不放的时间 |
| BTN_LONG_START | 长按触发一次 |
| BTN_LONG_SHOOT | 长按连续触发 |
函数列表
void xBtnInit(uint16_t id,isBtnPressFunc pFunc);
ldButtonActionInit(nameId)
void xBtnConfig(uint8_t debounceMs,uint16_t longPressMs,uint16_t longShootMs,uint16_t clickTimeOutMs);
void xBtnTick(uint8_t cycleMs,void* pUser);
uint16_t xBtnGetState(uint16_t id, uint8_t state);
void xBtnReset(void);
void xBtnDestroy(void);
函数说明
| 函数 |
|
|
| 说明 | 按键动作初始化函数 | |
| 参数 | id | 按键id或实体按键自定义序号 |
| pFunc | 获取按键状态的函数指针 | |
| 注意 ℹ️ | 实体按键和ldgui触摸按键混合使用的时候,id不可冲突,建议将实体按键序号从1000开始命名 | |
| 函数 |
|
|
| 说明 | 按键动作初始化函数,ldgui触摸按键专用 | |
| 参数 | nameId | 按键id |
| 注意 ℹ️ | 已内置触摸按键检测函数,无需用户编写 | |
| 函数 |
|
|
| 说明 | 按键参数配置,如果不配置则使用预设参数 | |
| 参数 | debounceMs | 按键滤波时间 |
| longPressMs | 长按触发时间 | |
| longShootMs | 长按连续触发间隔 | |
| clickTimeOutMs | 连击超时时间 | |
| 函数 |
|
|
| 说明 | 指定时间间隔内定时执行的函数,ldgui内部已经集成 | |
| 参数 | cycleMs | 定时周期 |
| pUser | 用户函数指针,不使用则填NULL | |
| 函数 |
|
|
| 说明 | 检测目标按键是否符合对应状态 | |
| 参数 | id | ldgui触摸按键填写nameId,外部实体按键填写自定义的按键编号 |
| state | 期望状态类型 | |
| 返回 | 状态值或需要的数据 | |
| 函数 |
|
|
| 说明 | 复位按键检测的过程数据,一般切换页面的时候使用 | |
| 函数 |
|
|
| 说明 | 销毁所有按键数据 | |
实体按键使用举例
//自定义实体按键序号
#define KEY_NUM_UP 1000
void SysTick_Handler(void)
{
xBtnTick(10,0);//10ms
}
//根据按键序号,获取按键状态
//按下返回true
bool vtIsKeyPress(uint16_t value)
{
switch (value)
{
case KEY_NUM_UP:
{
if(keyIsPress==true)
{
return true;
}
}
default:
break;
}
return false;
}
//初始化按键
xBtnInit(KEY_NUM_UP,vtIsKeyPress);
//循环处理函数
void loopFunc(void)
{
//判断按键按下
if(xBtnGetState(KEY_NUM_UP,BTN_PRESS))
{
//触发用户处理代码
}
}
ldgui使用举例
//自定义实体按键序号
#define ID_BG 0
#define ID_BTN 1
void uiDemoInit(ld_scene_t* ptScene)
{
void *obj,*win;
//新建背景
obj=ldWindowInit(ID_BG, ID_BG, 0, 0, LD_CFG_SCEEN_WIDTH, LD_CFG_SCEEN_HEIGHT);
//新建按键
obj=ldButtonInit(ID_BTN,ID_BG, 10,10,50,30);
//触摸按键的动作功能初始化
ldButtonActionInit(ID_BTN);
}
void uiDemoLoop(ld_scene_t* ptScene)
{
//判断按键状态
if( xBtnGetState(ID_BTN, BTN_DOUBLE_CLICK))
{
//触发用户处理代码
}
}
| ℹ️ Note | |
|---|---|
| 注意 | 获取按键状态的函数,可以每个按键对应一个函数,也可以多个按键共用一个函数,即上述例子中的bool vtGetKeyState(uint16_t value) |
queue 队列
这是一个简单的队列软件库
函数列表
xQueue_t* xQueueCreate(uint32_t length, uint32_t itemSize);
bool xQueueEnqueue(xQueue_t *queue ,void * pInItem,uint32_t itemSize);
bool xQueueDequeue(xQueue_t *queue ,void * pOutItem,uint32_t itemSize);
uint32_t xQueueGetLength(xQueue_t *queue);
void xQueueClear(xQueue_t* queue);
使用举例
typedef struct{
uint16_t senderId;
uint8_t signalType;
size_t value;
}emitInfo_t;
xQueue_t *emitQueue=NULL;
emitInfo_t emitInfo;
//创建队列
emitQueue=xQueueCreate(EMIT_QUEUE_SIZE,sizeof (emitInfo_t));
//写入数据,入队
emitInfo.senderId=0;
emitInfo.signalType=1;
emitInfo.value=10;
xQueueEnqueue(emitQueue,&emitInfo,sizeof (emitInfo_t));
//判断数据数量
if(xQueueGetLength(emitQueue)>0)
{
//读取数据,出队
if(xQueueDequeue(emitQueue,&emitInfo,sizeof (emitInfo)))
}
log 打印日志
支持普通打印和彩色打印
支持信息等级分类
配置
USE_LOG_COLOR
=0 普通打印
=1 彩色打印(需要控制台支持,推荐MobaXterm)
SET_LOG_LEVEL
=LOG_LEVEL_NONE
=LOG_LEVEL_ERROR
=LOG_LEVEL_WARNING
=LOG_LEVEL_INFO
=LOG_LEVEL_DEBUG
LOG_PRINT
默认为printf,可自定义串口硬件
函数接口
LOG_ERROR(fmt, …)
LOG_WARNING(fmt, …)
LOG_INFO(fmt, …)
LOG_DEBUG(fmt, …)
使用举例
LOG_DEBUG("click widget id:%d\n",pWidget->nameId);
string 字符串处理
对字符串进行简单的转换处理
函数接口
int32_t xStrToI32(uint8_t * str);
uint8_t* xI32ToStr(int32_t inInt32,uint8_t *buf);
float xStrToFloat(uint8_t * str);
uint8_t* xFloatToStr(float inFloat,uint8_t afterDecimalPointNum,uint8_t *buf);
使用举例
int32_t value;
value = xStrToI32("123");
// value = 123
uint8_t text[16];
float fValue=3.1415926;
text = xFloatToStr(fValue,2,text);
// text = "3.14"
timer 软件定时器
基于arm2d的基础上衍生的软件定时器
函数接口
bool ldTimeOut(uint16_t ms, bool isReset,…)
使用举例
//计数变量
int64_t sysTimer=0;
//循环处理函数
void loopFunc(void)
{
//使用自定义的计数变量
if(ldTimeOut(10,true,&sysTimer))
{
//10ms处理一次的用户代码
}
//使用自动生成的计数变量
if(ldTimeOut(100,true))
{
//100ms处理一次的用户代码
}
}