系统功能

添加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);,进行设定启动页面。

    #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);
说明 销毁所有按键数据

实体按键使用举例

//自定义实体按键序号
#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处理一次的用户代码
    }
}