全志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) 一、意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、…...
SDXL-Turbo在虚拟现实中的应用:实时环境生成技术
SDXL-Turbo在虚拟现实中的应用:实时环境生成技术 想象一下,在虚拟世界中每走一步,周围的景色就随之变化——茂密的森林在你眼前生长,古老的城堡在远处拔地而起,这一切都发生在眨眼之间。这不是魔法,而是SDX…...
Python跑在浏览器里?揭秘2024最稳WASM部署方案:3大框架实测对比+性能压测数据
第一章:Python跑在浏览器里?揭秘2024最稳WASM部署方案:3大框架实测对比性能压测数据Python 从未真正“离开服务器”,但 2024 年,它已能以接近原生的速度在浏览器中执行——依托 WebAssembly(WASM࿰…...
资源占用优化:OpenClaw在RTX4090D上并发控制策略
资源占用优化:OpenClaw在RTX4090D上并发控制策略 1. 为什么需要关注OpenClaw的资源占用? 去年冬天,当我第一次在RTX4090D上部署OpenClaw对接Qwen3-32B模型时,系统频繁崩溃的场景至今记忆犹新。原本以为24GB显存足以应对常规任务…...
RAG开发
LangChain通用提示词模板:from langchain_core.prompts import PromptTemplate from langchain_community.llms import Tongyiprompt_template PromptTemplate.from_template("我的邻居姓{lastname},刚生了{gender}" )prompt_template.format(lastname …...
别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?
定位技术实战指南:从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上,无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块?RTK的厘米级精度令人心动,但架设基准站的成本让他犹豫;PPP技术号…...
驯服失控菜单:让右键操作提速60%的实战指南
驯服失控菜单:让右键操作提速60%的实战指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 当你在Windows系统中右键点击文件时,是否曾面…...
告别重复劳动:用快马生成自动化脚本,实现dify多环境一键部署与高效管理
在团队协作中,dify的部署工作常常成为效率瓶颈。每次新版本发布或环境迁移时,手动配置docker-compose文件、处理版本差异、备份数据等重复操作不仅耗时,还容易出错。最近尝试用InsCode(快马)平台生成自动化脚本集,意外发现部署效率…...
Vivado中OSD核报错全攻略:从IP_flow 19-167到BD 41-1030的解决方案
Vivado中OSD核报错全攻略:从IP_flow 19-167到BD 41-1030的解决方案 在FPGA开发过程中,Xilinx Vivado工具链的OSD(On-Screen Display)核是一个常用的视频处理IP,但开发者常会遇到各种报错问题。本文将深入解析从IP_flo…...
springboot基于协同过滤推荐算法的图书借阅推荐系统
目录需求分析与系统设计数据准备与处理协同过滤算法实现推荐系统集成系统测试与优化部署与监控项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与系统设计 明确系统的核心功能需求,包括用户管理、图书管理、…...
缺失的第一个正数(力扣100)
最朴素的想法就是从1开始查找,看看谁不在,时间复杂度为On但是需要把原数组变成集合,空间复杂度为On不符合题目的常数级空间开销我们要找的是“第一个缺失的正数”。如果数组长度是 $N$,那么这个答案一定落在 [1, N1] 这个区间里。…...
