SeniorOS
一款运行在 handpy(mPython)/掌控板 平台上的轻量级开源用户界面框架
Bilibili:这里是 SeniorOS|掌控板上的用户界面框架
请注意
在这里下载的程序文件,仅仅只是该文档发布时的最新版构建后的可运行文件,该项目更新频率较高,我们建议你到下方开源仓库中下载源代码自行构建
开源地址
开放文档
帮助与支持
如果你遇到了问题或者你想要反馈问题,你可以去我们的 GitLab 仓库提交你的 issues,当然,你也可以加入我们的群聊:
致谢
感谢 Gxxk POLA(Kenny) LP_OVER CycleBai(Mask) emofalling(emo中沉没) 对我无私的帮助。视频与文字中所有的“我们”便是“他们”,尽管有些已离该项目渐行渐远...
感谢 TaoLiSystem GxxkSystem ,作为前车之鉴,他们总在需要时给与该项目启发
从 Flag OS 到 SeniorOS,你现在看到的便是我们全部的成果
----------------------------------------------------------
技术层实现
1. 多文件架构
提升代码可读性,为复杂开发提供基础
2. 构建机制
SROS 早期开发中,我们引入了构建机制,其目的有两个
a. 直接编译为 .mpy 字节码,优化性能
b. 引伸出一批 SeniorOS 独有 API ,我们稍后提到
3. 模块化
我们大力解决系统资源的调用及分配,在保证重要功能不被缩减的前提下大力精简代码、优化占用、提升速度
我们将大量常用方法封装或对不够简便的原生方法进行二次封装,如同将代码分类归放,让开发者即取即用,方便开发调试,同时也有效降低了代码重复率
4. ReplaceExpr 机制
这便是上文所提到的“SeniorOS 独有 API”
对应文件 ./tools/ReplaceExpression.py
用于替换 SeniorOS 中的 ReplaceExpr 表达式
你可以经常在项目中看到如这样的代码 - eval("[/GetButtonExpr('python')/]")
在构建的 EXPR 阶段,其将被替换为
touchpad_p.is_pressed() or touchpad_y.is_pressed() or touchpad_t.is_pressed() or touchpad_h.is_pressed() or touchpad_o.is_pressed() or touchpad_n.is_pressed()
用更简洁的写法,实现同样的效果
5. BuildConfig 机制
基于 ReplaceExpr 机制实现
对应文件 ./tools/BuildConfig.py
我们将重要的、用途广泛的字符串归纳于此,方便开发者调用、更改
不过多赘述
6. DevLib 库
掌控板内设操作库,相对于 mpython 库,重写/优化了大量组件
以 oled 对象为例
oled 对象为重写过的来自 mpython 库的 ssd1106.SSD1106_I2C 的衍生类,继承 ssd1106.SSD1106_I2C 和 FrameBuffer 的方法。相较于 mpython 库拥有更好的性能表现和更丰富的玩法
7. Dynamic Page Refresh ( DPR )
是一种针对能够局部刷新画面的屏幕的优化方案。启用 DPR 后,能够极大的提升局部渲染时的刷新性能,提升用户体验
拿 ssd1106 举例。它有8个可以分别独立刷新的图像缓冲区( page0 ~ page7 ),每个缓冲区都可以独立刷新。但是在传统的用法中,将缓冲区内容传输到屏幕上时,
往往都是每次刷新都会将所有缓冲区传输到屏幕上。对于有高频率的局部刷新的元素,会导致数据浪费( 即有大部分重复的数据 ),影响用户体验
启用 DPR 后,将不会使用传统的一次性发送,而是先判断哪些缓冲区有变化,然后只发送有变化的缓冲区。从而实现局部刷新,提升用户体验
传统用法(注:这里的 page 代指任意一个 page )
page ---> ssd1106_page
启用 DPR 后
previous_page_record <----------------------------------------
| |
| And copy to the previous_page_record |
| |
--------------------- |
| |
if page != previous_page_record |
page ----------------------------------------------------------> ssd1106_page
No | Yes
|
pass
8. PagesManager
SeniorOS 页面动态加载组件
SeniorOS 专门引入了一个页面管理库,位于 system/pages_manager.py
示例: PagesManager.Main.Import("SeniorOS.system.pages", "CloudNotification")
为什么要使用这个而不是直接 import?
在目前版本中,这样可以避免一些 Python 本身的问题,同时,方便规范各种机制(例如错误处理)
同时,未来我们可能在其中引入更多机制(例如屏幕切换概念)
9. LogManager
SeniorOS 日志输出管理库
统一日志输出规范,方便开发调试
10. AppSetup
SeniorOS 本地应用安装机制
安装包写法:
bytearray([0XF0, ... ,0X00,]) 应用图标
示例应用 应用名称
example.py 安装完成后,应用在 apps/ 目录下的文件名
空行,代表配置信息书写结束
import os 应用源代码
print("test")
如何安装?
import SeniorOS.system.core as Core
Setup = Core.AppSetup(filePath)
Setup.Main()
用户操作层
11. Pages 库
系统核心页面组件所在的库
11. DayLight 库 ( 不包括 VastSea 类 )
系统的 GUI 库
大量的用户操作方法均在此处
以选择器为例,在 system/daylight.py 中,有为专门构建选择器而产生的 Select 类,其中内置了四种样式
DayLight.Select.Style1(dispContent:list, y:int, window:bool = False, appTitle = None)
DayLight.Select.Style2(dispContent:list, tip:list, y:int, window:bool = False, appTitle = None)
DayLight.Select.Style3()
( 该选项无用户界面)
DayLight.Select.Style4(dispContent:list, window:False, appTitle:str = False)
12. VastSea 类
系统动画引擎
以 SeniorMove 类为例,SeniorMove 中的三个方法将在下面讲述
DayLight.SeniorMove.Text(text, startX, startY, endX, endY) 文字位移动画
DayLight.VastSea.SeniorMove.Line(startX, startY, startX2,startY2, endX, endY, endX2, endY2, fill:bool = True) 线条位移动画
DayLight.VastSea.SeniorMove.Bitmap(bitMap, startX, startY, endX, endY, h, w) 图像位移动画
13. And More...
篇幅有限,还有大量的技术实现与用户操作的方面未提到,请自行查看源代码
9