UEFI开发探索31–鼠标GUI构建
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365)
进行了上一篇博客所描述的各种实验,相关的代码基本都已经搭建好了,我们可以着手进行对GUI界面的鼠标支持了。
UEFI对开发者提供中断支持,所有异步操作都可以通过Event来完成。Simple Pointer Procotol也提供了对此机制的支持,根据文档中函数的说明,构建如下的函数:
图1 鼠标GUI函数
Line8-Line10的四个函数是主力工作的函数:初始化鼠标图像initMouseArrow;检查是否有鼠标事件触发CheckMouseEvent;获取鼠标消息GetMouseState;更新鼠标状态putMouseArrow。
相比之前Legacy BIOS下构建的鼠标驱动,这个简化得太多了,不由得想安慰一下苦苦调试的当年的我。
1 程序构建
一些相对较老的BIOS,对鼠标支持得还不是很好,不过去定位Simple Pointer Protocol的时候,还是能定位到。这种情况对代码逻辑没有什么影响,只是无法在GUI界面上支持鼠标了。
另外一个问题是,前一篇中挖下的问题坑:RelativeMovementX、RelativeMovementY和USB HID协议中的逻辑位移量有什么区别和联系。我个人的猜测是,没有什么直接联系。这是两个不同架构体系下,对鼠标位移量的不同表达。
在UEFI下,鼠标位置的移动,应该结合Mode->ResolutionX、Mode->ResolutionY来综合考虑。如果以像素单位,鼠标的位移公式应该为RelativeMovmentX * MouseRegulator/ResolutionX(Y轴的计算公式类似)。其中,MouseRegulator为用户定义的调节因子,用来调节鼠标移动的灵敏度。
比如,在我的程序中,我将调节因子设为了8。
图2 图形模式下鼠标显示
程序逻辑很简单:当用户鼠标左键和右键同时按下,退出while循环。在循环体中,如果发生了鼠标事件,则获取鼠标的信息。计算出位移值,更新鼠标位置,同时更新鼠标图像。
也许是因为汇编程序写得比较多,对程序的运行效率我比较执着。计算位移量时,也简化了计算过程,主要通过移位计算来实现。其中,右移xScale和yScale分别代表ResolutionX和ResolutionY的除法计算。
测试中发现,ResolutionX一般都是2^n,所以将其幂n计算出来了。采用这种方法,不用去关心恼人的类型转换,代码也简化了很多。
2 程序运行
和上一篇一样,鼠标的程序无法在模拟环境下运行。编译成X64的UEFI app,在实际机器上运行效果如下(intel NUC6CAY):(视频太大了,无法转换为2M以下的GIF图像,我将视频放在了gitee上了- 20190703鼠标程序演示.mp4)
图3 在NUC6CAY上运行鼠标程序
我在能找到的几个平台上都试了下,特别是2016年之后的机器,支持得都很好。至此,鼠标的支持工作就完成了。
为了便于在模拟环境上演示,添加了一段代码,用键盘方向键来控制鼠标图标的移动。与鼠标控制代码共存,也工作得很好,下面是在模拟环境下运行的情况(此时不支持鼠标,只能通过键盘方向键控制)
图4 键盘控制鼠标图标
3 One More Thing
在实际的商业产品中,“颜值”非常重要,如何激起用户的购买欲望,除去功能性满足要求外,产品的外观占据的比重比我们想象的要大得多。
我有段时间特别沉迷于图像特效的处理,也试着把隔离卡的底层界面做得有透明感,仿照苹果的UI做了一些设计。当时的Leader笑我不务正业,做完后的程序最终也没有用到产品上。
在我自己的开源项目Foxdisk的开发中,终于一偿夙愿。把我喜欢的一些特效,比如图像的渐隐、渐出;图标透明、字体自动阴影、亮化和暗化等等,都实现了出来。
人的本性终究是按捺不住的啊~~
实际上,本篇博客中的代码实现,鼠标图标就是透明的,在Gif图中可以看出。其实原理也比较简单,组合之后,能实现很多有意思的效果。
我在UEFI代码中实现了一部分特效功能,下一篇就来聊聊这个。
Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/21 Mouse-GUI 下
UEFI开发探索31–鼠标GUI构建相关推荐
- UEFI开发探索11 – 鼠标前传
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) 这篇博客不是要写鼠标的历史,而是记录在很久以前,在Legacy BIOS下,我写鼠标驱动(B ...
- UEFI开发探索97 – EDK2模拟器搭建网络环境
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) EDK2模拟器搭建网络环境 1 搭建EDK2开发环境 1)工具安装 2)下载代码库 3)更新子模 ...
- UEFI开发探索85- YIE002USB开发板(08 制作HID设备)
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-编程 1 YIE002-STM32的USB编程 2 调 ...
- UEFI开发探索99 – UEFI Shell下截屏工具
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI Shell下截屏工具 1 PrintScreenLogger的代码结构 1)Print ...
- UEFI开发探索QA – 问题辑录(持续更新)
最近正在尝试在Unbutu16上搭建开发和调试环境,其中过程一言难尽,到现在也没完成到符合我要求的程度. 正是因为遇到障碍,我今天早上回到Win10+UDK2018的环境下,想重新编译下AppPkg, ...
- UEFI开发探索95 – 弹跳小游戏
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) UEFI下的弹跳小游戏 1 Bounce游戏 1.1 游戏架构 1.2 移植和编写代码 1)编写 ...
- UEFI开发探索32 – 有趣的图像特效
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) PhotoShop和ACD See中,有各种对图像进行特效处理的功能,我在大学的时候就很着迷 ...
- UEFI开发探索100 – 《UEFI编程实践》发布啦
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) <UEFI编程实践>发布 1 内容简介 第一部分 UEFI环境搭建及UEFI应用构建 ...
- UEFI开发探索02 – 环境搭建1
(请保留->作者:罗冰 ) 开发初期的目的就是做出可以在pci rom上跑的Oprom,当然是在uefi bios下.我的计划大致如下: 1 搭建完整的编译环境,了解使用哪些库进行编译: 2 我 ...
- UEFI开发探索81- YIE002USB开发板(04 制作HID设备)
(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) YIE002USB开发板之制作HID设备-USB系统概述 1 USB规范简介 2 软件工程师眼中 ...
最新文章
- Centos7上yum安装redis
- LeetCode 94. 二叉树的中序遍历(中序遍历)
- python not in range1002无标题_Python中偶尔遇到的细节疑问(一):去除列名特殊字符、标准差出现nan、切片索引可超出范围、range步长、众数...
- 【MatConvNet】配置GPU
- HTML静态网页--图片热点
- C++ tbb::atomic
- java 学习资料总结
- Android车牌识别SDK
- PowerDesigner如何自定义报表模板
- python学习(判断某年某月某日)
- js html监听ctrl v,js监听组合按键
- 今日头条、抖音创始人张一鸣
- 如何在php中显示170cm,身高 158cm,怎么穿才能像 170cm?
- 蓝牙核心技术概述(一):蓝牙概述
- 用卡尔曼滤波器跟踪导弹
- 时间频度和时间复杂度
- 【新闻早知道】10月13日 星期日
- 《寒蝉鸣泣之时:携带版》游戏截图
- android+汉王手写引擎,汉王推键盘输入引擎 从手写专家到输入法专家
- 局域网限制网速软件_Oka WiFi测网速 for Mac(网络测速软件)