# 系统功能
## 添加UI页面文件
1. 运行脚本src/template/uiPageCreate.py。
2. 按提示选择新增页面文件,输入页面名称,例如demo。
3. 按回车后,在当前目录下生成文件夹uiPageOutput,里边包含所需要的文件uiDemo.c、uiDemo.h、uiDemoLogic.c、uiDemoLogic.h。
4. 将文件导入项目中,main.c中添加头文件uiDemo.h。
5. 在main函数中添加ldGuiInit(&uiDemoFunc);,进行设定启动页面。
~~~c
#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);
#### 函数说明
| 函数 |
void xBtnInit(uint16_t id,isBtnPressFunc pFunc);
|
| 说明 |
按键动作初始化函数 |
| 参数 |
id |
按键id或实体按键自定义序号 |
| pFunc |
获取按键状态的函数指针 |
| 注意 ℹ️ |
实体按键和ldgui触摸按键混合使用的时候,id不可冲突,建议将实体按键序号从1000开始命名 |
---
| 函数 |
ldButtonActionInit(nameId)
|
| 说明 |
按键动作初始化函数,ldgui触摸按键专用 |
| 参数 |
nameId |
按键id |
| 注意 ℹ️ |
已内置触摸按键检测函数,无需用户编写 |
---
| 函数 |
void xBtnConfig(uint8_t debounceMs,uint16_t longPressMs,uint16_t longShootMs,uint16_t clickTimeOutMs);
|
| 说明 |
按键参数配置,如果不配置则使用预设参数 |
| 参数 |
debounceMs |
按键滤波时间 |
| longPressMs |
长按触发时间 |
| longShootMs |
长按连续触发间隔 |
| clickTimeOutMs |
连击超时时间 |
---
| 函数 |
void xBtnTick(uint8_t cycleMs,void* pUser);
|
| 说明 |
指定时间间隔内定时执行的函数,ldgui内部已经集成 |
| 参数 |
cycleMs |
定时周期 |
| pUser |
用户函数指针,不使用则填NULL |
---
| 函数 |
uint16_t xBtnGetState(uint16_t id, uint8_t state);
|
| 说明 |
检测目标按键是否符合对应状态 |
| 参数 |
id |
ldgui触摸按键填写nameId,外部实体按键填写自定义的按键编号 |
| state |
期望状态类型 |
| 返回 |
状态值或需要的数据 |
---
| 函数 |
void xBtnReset(void);
|
| 说明 |
复位按键检测的过程数据,一般切换页面的时候使用 |
---
| 函数 |
void xBtnDestroy(void);
|
| 说明 |
销毁所有按键数据 |
---
#### 实体按键使用举例
```c
//自定义实体按键序号
#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使用举例
```c
//自定义实体按键序号
#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);
#### 使用举例
```c
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, ...)
#### 使用举例
```c
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);
#### 使用举例
```c
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,...)
#### 使用举例
```c
//计数变量
int64_t sysTimer=0;
//循环处理函数
void loopFunc(void)
{
//使用自定义的计数变量
if(ldTimeOut(10,true,&sysTimer))
{
//10ms处理一次的用户代码
}
//使用自动生成的计数变量
if(ldTimeOut(100,true))
{
//100ms处理一次的用户代码
}
}
```