全志ARM926 Melis2.0系统的开发指引⑧
全志ARM926 Melis2.0系统的开发指引⑧
- 编写目的
- 12.5. 应用程序编写
- 12.5.1. 简单应用编写
- 12.5.1.1. 注册应用
- 12.5.1.2. 创建管理窗口
- 12.5.1.3. 实现管理窗口消息处理回调函数
- 12.5.1.4. 创建图层
- 12.5.1.5. 创建 framewin
- 12.5.1.6. 实现 framewin 消息处理回调函数
- -. 全志相关工具和资源
- -.1 全志固件镜像修改工具 ImageModify.exe 下载
- -.2 全志固件USB刷机工具 PhoenixSuit 下载
- -.3 全志Melis2.0 用户手册.pdf下载
- -.4 全志melis2.0 sdk源码库下载
编写目的
本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。
12.5. 应用程序编写
12.5.1. 简单应用编写
用户程序编写最基本的 6 个步骤:注册应用、创建管理窗口 manwin 并实现回调函数、创建图层、创建framewin 并实现回调函数。下面进行介绍。
12.5.1.1. 注册应用
新方案中,只有一个主应用,子应用由主应用启动,用户应用程序为子程序。主应用默认启动 home
子应用,并由 home 子应用启动其他子应用。因此 home 子应用定义了要切换的子应用 ID。
ROOT\livedesk\beetles\applets\lib\beetles_app.h 文件中定义了子应用 ID 枚举 root_home_id_t,添加项ID_HOME_TEST_APP。
typedef enum
{ID_HOME_FM = 0, ID_MEDIA_START, ID_HOME_RECORD=ID_MEDIA_START, ID_HOME_MOVIE, ID_MEDIA_END, ID_HOME_SETTING = ID_MEDIA_END, ID_HOME_TEST_APP, ID_MAX_NUM, } root_home_id_t;
为方便窗口、图层创建,在 ROOT\livedesk\beetles\applets\lib\beetles_app.h 加入定义,窗口或图层创建时使用此名称以进行区分。
#define APP_TEST "app_test"
12.5.1.2. 创建管理窗口
管理窗口是所有应用的入口,负责接收消息。创建管理窗口时,id 参数请使用注册 ID 即 APP_TEST。用户也可以添加自定义结构体用于参数传递,即 create_info.attr 参数。
_s32 app_test_create(root_para_t *para)
{ __gui_manwincreate_para_t create_info;test_app_ctrl_t *test_app_ctrl = NULL; __log("****************************************************************************************\n"); __log("********************************** enter test app ************************************\n"); __log("****************************************************************************************\n");test_app_ctrl = (test_app_ctrl_t)esMEMS_Balloc(sizeof(test_app_ctrl_t));if( test_app_ctrl == NULL ){ __msg("test app esMEMS_Balloc fail\n"); return NULL;}eLIBs_memset(test_app_ctrl, 0, sizeof(test_app_ctrl_t));test_app_ctrl->test_app_font = para->font;test_app_ctrl->root_type = para->root_type; eLIBs_memset(&create_info, 0, sizeof(__gui_manwincreate_para_t)); create_info.name = APP_TEST; create_info.hParent = para->h_parent; create_info.ManWindowProc = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)_app_test_proc); create_info.attr = (void*)test_app_ctrl; create_info.id = APP_TEST; create_info.hHosting = NULL; return(GUI_ManWinCreate(&create_info));
}
12.5.1.3. 实现管理窗口消息处理回调函数
消息处理函数为管理窗口中设置的回调函数,在发生消息传递时先被调用。主要集中处理
GUI_MSG_CREATE、GUI_MSG_DESTROY、GUI_MSG_CLOSE、GUI_MSG_KEY、GUI_MSG_TOUCH 等系统消息,也可以
处理用户自定义消息。
static __s32 _app_test_proc(__gui_msg_t *msg)
{ __s32 ret; switch( msg->id ){case GUI_MSG_CREATE: /* 创建子窗口*/layer = htouch_layer_create(); /* 创建图层*/GUI_LyrWinSetTop(layer); /* 图层置顶*/htouch_frmwin_create(msg->h_deswin, layer); /* 创建 framewin*/return EPDK_OK;/*释放在 create 中分配的资源,尽量在此回调中释放资源,而不要在退出消息循环后在释放资源*/ case GUI_MSG_DESTROY: GUI_LyrWinDelete(layer); return EPDK_OK;/* 需要支持的桌面消息*/ case DSK_MSG_HOME: /* 回到主界面 */ case DSK_MSG_KILL: /* 强制杀掉该应用程序 */ret = GUI_ManWinDelete(msg->h_deswin); return ret; case GUI_MSG_CLOSE:GUI_ManWinDelete(msg->h_deswin);dsk_load_app("main.app"); /* 回到主界面 */return EPDK_OK; case GUI_MSG_KEY: /* 按键响应 */if( msg->dwAddData1 == GUI_MSG_KEY_ESCAPE ){GUI_ManWinDelete(msg->h_deswin);dsk_load_app("main.app"); return EPDK_OK;}break;default: break;}return GUI_ManWinDefaultProc(msg);/*默认处理流程*/
}
12.5.1.4. 创建图层
此图层为应用程序显示区域,设置显示矩形区域位置和大小,设置区域格式为 ARGB 或者其他。图层成功创建完毕后将会返回图层句柄。
static H_LYR test_app_32bpp_layer_create(RECT *LayerRect)
{H_LYR layer = NULL;RECT LayerRect;FB fb ={{0, 0}, /* size */{0, 0, 0}, /* buffer */{FB_TYPE_RGB, {PIXEL_COLOR_ARGB8888, 0, (__rgb_seq_t)0}}, /* fmt */};__disp_layer_para_t lstlyr ={DISP_LAYER_WORK_MODE_NORMAL, /* mode */0, /* ck_mode */0, /* alpha_en */0, /* alpha_val */1, /* pipe */0xff, /* prio */{0, 0, 0, 0}, /* screen */{0, 0, 0, 0}, /* source */DISP_LAYER_OUTPUT_CHN_DE_CH1, /* channel */NULL /* fb */};__layerwincreate_para_t lyrcreate_info ={ "APP_TEST", NULL, GUI_LYRWIN_STA_SUSPEND, GUI_LYRWIN_NORMAL};fb.size.width = LayerRect->width;fb.size.height = LayerRect->height;fb.fmt.fmt.rgb.pixelfmt = PIXEL_COLOR_ARGB8888;lstlyr.src_win.x = LayerRect->x;lstlyr.src_win.y = LayerRect->y;lstlyr.src_win.width = LayerRect->width;lstlyr.src_win.height = LayerRect->height;lstlyr.scn_win.x = LayerRect->x;lstlyr.scn_win.y = LayerRect->y;lstlyr.scn_win.width = LayerRect->width;lstlyr.scn_win.height = LayerRect->height;lstlyr.pipe = 1;lstlyr.fb = &fb;lyrcreate_info.lyrpara = &lstlyr;layer = GUI_LyrWinCreate(&lyrcreate_info);if( !layer ){ __err("test app layer create error !\n");}return layer;
}
12.5.1.5. 创建 framewin
Framewin 需要传入创建的图层句柄,以操作图层。主要工作是绘图,如创建窗口绘图、按键或触摸改变焦点绘图等。这些工作在回调中实现。另外可以传入一些用户自定义结构体数据,即framewin_para.attr参数。
static H_WIN test_app_framewin_create(H_WIN h_parent, setting_general_para_t *para)
{ __gui_framewincreate_para_t framewin_para;setting_general_para_t *general_para;FB fb;GUI_LyrWinGetFB(para->layer, &fb);eLIBs_memset(&framewin_para, 0, sizeof(__gui_framewincreate_para_t));framewin_para.name = "test_app win", framewin_para.dwExStyle = WS_EX_NONE;framewin_para.dwStyle = WS_NONE|WS_VISIBLE;framewin_para.spCaption = NULL;framewin_para.hOwner = NULL;framewin_para.id = GENERAL_MENU_ID;framewin_para.hHosting = h_parent;framewin_para.FrameWinPro= (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)htouch_frmwin_cb);framewin_para.rect.x = 0;framewin_para.rect.y = 0;framewin_para.rect.width = fb.size.width;framewin_para.rect.height = fb.size.height;framewin_para.BkColor.alpha = 0;framewin_para.BkColor.red = 0;framewin_para.BkColor.green = 0;framewin_para.BkColor.blue = 0;framewin_para.attr = NULLframewin_para.hLayer = para->layer;return (GUI_FrmWinCreate(&framewin_para));
}
12.5.1.6. 实现 framewin 消息处理回调函数
在此回调中完成图层绘制。可以在 GUI_MSG_CREATE 或 GUI_MSG_PAINT 消息中绘制应用界面,图片、文字的使用和绘制请参考第 5 章中。处理按键消息 GUI_MSG_KEY 或触摸消息 GUI_MSG_TOUCH,更新焦点等。应用程序能处理父窗口发送的 GUI_MSG_COMMAND 自定义命令,并完成相应的绘制或其他响应,此外也能发送响应结果到父窗口或其他目标窗口。
static __s32 htouch_frmwin_cb(__gui_msg_t *msg)
{ switch( msg->id ){ case GUI_MSG_CREATE: {htoutch_frmw_ctr *ctr;button_para_t *para; ctr = esMEMS_Malloc(0, sizeof(htoutch_frmw_ctr));if( !ctr ){ __err(" frmwin malloc fail \n"); return EPDK_FALSE;}eLIBs_memset(ctr, 0, sizeof(htoutch_frmw_ctr));para = &(ctr->para); ctr->focus_size =get_res_them(&(para->focus_bmp), STYLEID,ID_HELLOTOUCH_FOCUS_PIC_BMP); ctr->unfocus_size = get_res_them(&(para->unfocus_bmp), STYLEID,ID_HELLOTOUCH_UNFOCUS_PIC_BMP);para->bmp_pos.x = 0;para->bmp_pos.y = 0;htouch_static_ctl_create(msg->h_deswin, para);GUI_WinSetAddData( msg->h_deswin, (__u32)ctr); return EPDK_OK;}case GUI_MSG_DESTROY: {htoutch_frmw_ctr *ctr = (htoutch_frmw_ctr *)GUI_WinGetAddData(msg->h_deswin);free_res_them(ctr->para.focus_bmp, ctr->focus_size);free_res_them(ctr->para.unfocus_bmp, ctr->unfocus_size); esMEMS_Mfree(0, ctr); return EPDK_OK;}case GUI_MSG_CLOSE: {GUI_FrmWinDelete(msg->h_deswin); return EPDK_OK;}case GUI_MSG_COMMAND: { switch(LOSWORD(msg->dwAddData1)){ case ID_WIDGET_STATIC: { switch( HISWORD(msg->dwAddData1) ){case BN_CLICKED: { __gui_msg_t msgex; eLIBs_memset(&msgex, 0, sizeof(__gui_msg_t)); msgex.id = GUI_MSG_CLOSE; msgex.h_srcwin = 0; msgex.h_deswin = GUI_WinGetManWin(msg->h_deswin);GUI_SendNotifyMessage(&msgex);break;}}break;}}return EPDK_OK;}default: break;}return GUI_FrmWinDefaultProc(msg);
}
-. 全志相关工具和资源
-.1 全志固件镜像修改工具 ImageModify.exe 下载
下载地址:
固件镜像修改工具 ImageModify.exe下载 ImageModify_20230906.rar
-.2 全志固件USB刷机工具 PhoenixSuit 下载
下载地址:
USB刷机工具 PhoenixSuit下载 PhoenixSuit_CN_V1.1.1_20230906.rar
-.3 全志Melis2.0 用户手册.pdf下载
下载地址:
全志Melis2.0 用户手册.pdf下载 documents_20230906_melis_v2.0.rar
-.4 全志melis2.0 sdk源码库下载
下载地址:
全志melis2.0 sdk源码库下载 melis2.0-sdk-release_20230906V2.0.rar
相关文章:

全志ARM926 Melis2.0系统的开发指引⑧
全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…...

区别对比表:阿里云轻量服务器和云服务器ECS对照表
阿里云轻量应用服务器和云服务器ECS区别对照表,一看就懂的适用人群、使用场景、优缺点、使用限制、计费方式、网路和镜像系统全方位对比,阿里云服务器网分享ECS和轻量应用服务器区别对照表: 目录 轻量应用服务器和云服务器ECS区别对照表 轻…...

【做题笔记】多项式/FFT/NTT
HDU1402 - A * B Problem Plus 题目链接 大数乘法是多项式的基础应用,其原理是将多项式 f ( x ) a 0 a 1 x a 2 x 2 a 3 x 3 ⋯ a n x n f(x)a_0a_1xa_2x^2a_3x^3\cdotsa_nx^n f(x)a0a1xa2x2a3x3⋯anxn中的 x 10 x10 x10,然后让大数的…...

网课搜题 小猿题库多接口微信小程序源码 自带流量主
多接口小猿题库等综合网课搜题微信小程序源码带流量主,网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载:https://download.csdn.net/download/m0_…...
centos安装conda python3.10
最新版本的conda自带python3.10,直接安装即可。 手动创建一个conda文件夹,进入该文件夹,然后执行以下操作步骤。 1.下载 curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh2.安装 sh Miniconda3-latest-Linux-x86_64.…...

解密京东面试:如何应对Redis缓存穿透?
亲爱的小伙伴们,大家好!欢迎来到小米的微信公众号,今天我们要探讨一个在面试中可能会遇到的热门话题——Redis缓存穿透以及如何解决它。这个话题对于那些渴望进入技术领域的小伙伴们来说,可是必备的哦! 认识Redis缓存…...
#力扣:1. 两数之和@FDDLC
1. 两数之和 - 力扣(LeetCode) 一、Java import java.util.HashMap;class Solution {public int[] twoSum(int[] nums, int target) { //返回数组HashMap<Integer, Integer> map new HashMap<>(); //键:元素值;值&…...

【小沐学Python】各种Web服务器汇总(Python、Node.js、PHP、httpd、Nginx)
文章目录 1、Web服务器2、Python2.1 简介2.2 安装2.3 使用2.3.1 http.server(命令)2.3.2 socketserver2.3.3 flask2.3.4 fastapi 3、NodeJS3.1 简介3.2 安装3.3 使用3.3.1 http-server(命令)3.3.2 http3.3.3 express 4、PHP4.1 简…...

【AI视野·今日Robot 机器人论文速览 第四十六期】Tue, 3 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Tue, 3 Oct 2023 Totally 76 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚Aerial Interaction with Tactile, 无人机与触觉的结合,实现空中交互与相互作用。(from CMU) website&#…...
macOS三种软件安装目录以及环境变量优先级
一、系统自带应用 这些软件(以git为例)位于根目录下的/usr/bin/xxx,又因为系统级环境变量文件/etc/paths已指定了命令查找位置: /usr/local/bin /System/Cryptexes/App/usr/bin /usr/bin /bin /usr/sbin /sbin所以这些自带应用可…...

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动
系列文章目录 文章目录 系列文章目录前言IMX6ULL介绍主要资料IO表现形式 汇编LED驱动原理图初始化流程时钟设置IO复用设置电气属性设置使用GPIO 编写驱动编译程序编译.o文件地址链接.elf格式转换.bin反汇编(其他) 综合成Makefile完成一步编译烧录程序imx…...

企业微信机器人对接GPT
现在网上大部分微信机器人项目都是基于个人微信实现的,常见的类库都是模拟网页版微信接口。 个人微信作为我们自己日常使用的工具,也用于支付场景,很怕因为违规而被封。这时,可以使用我们的企业微信机器人,利用企业微信…...

【数据结构】排序(1) ——插入排序 希尔排序
目录 一. 直接插入排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 希尔排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 直接插入排序 基本思想 把待排序的记录按其关键码值的大小依次插入到一个已经排好序的有序序列中,直到所有的记录插入完为止&…...

Python 列表推导式深入解析
Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式,用于创建列表。它基于一个现有的迭代器(如列表、元组、集合等)来生成新的列表。 基本语法: 列表推导式的基本形式如下: [expression for…...
信息学奥赛一本通-编程启蒙3103:练18.3 组别判断
3103:练18.3 组别判断 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 1963 通过数: 1418 【题目描述】 信息学课上要同学分组做期末报告,分组的方式为依座号顺序,每 3个人一组。如:1, 2, 3 为第一组,4, …...
C++ primer plus--探讨 C++ 新标准
18 探讨 C 新标准 18.1 复习前面介绍过的 C11 功能 (1)C11 扩大了列表初始化的适用范围,使用初始化列表时,可以不加等号。 int x {5}; float y {1.1}; short arr[5] {1, 2, 3, 4, 5}; int* ar new int[4] {1, 2, 3, 4}; vect…...

2023版 STM32实战6 输出比较(PWM)包含F407/F103方式
输出比较简介和特性 -1-只有通用/高级定时器才能输出PWM -2-占空比就是高电平所占的比例 -3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1- PWM工作模式 -1-2- 有效/无效电平 有效电平可以设置为高或低电平,是自己配置的 周期选择与计算 周期重…...

选择排序算法:简单但有效的排序方法
在计算机科学中,排序算法是基础且重要的主题之一。选择排序(Selection Sort)是其中一个简单但非常有用的排序算法。本文将详细介绍选择排序的原理和步骤,并提供Java语言的实现示例。 选择排序的原理 选择排序的核心思想是不断地从…...

安卓教材学习
文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要:选了几本教材《第一行代码 Android 第3版》,记录一下跑案例遇到的问题,和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…...

C++设计模式-生成器(Builder)
目录 C设计模式-生成器(Builder) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-生成器(Builder) 一、意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...