无聊水个贴(((
前两天无聊把我的一个吃灰了两三年的 SSD1306 屏幕翻出来了,想给 Jetson Nano 做个监控程序(主要是闲得慌)。我自己不懂 I2C 就先在 GitHub 上翻了翻有没有作业可以抄。搜索 SSD1306 之后热门的几个库都是 C/C++。虽然我的 C++ 水准在 Hello World C with Class 级别,但是本来想着 C/C++ 资料那么多,实现标准的话我还能看看文档抄抄作业糊一个出来。然而那些基本上都是给嵌入式平台设计的,没有用标准的构建系统,完全没有头绪应该怎么搞,于是放弃。
至于 Python 的话真的不想搞... 以前写过一个差不多的东西,但是性能实在是太烂了,再一个也怕跑久了漏内存太厉害。
后来仔细一看发现有搜索结果里面有个 Rust 的库,名字直接就叫 ssd1306,硬件相关的部分使用的 Rust-Embedded 的大佬们整的 embedded-hal。它实际上本来也是给嵌入式环境(主要是 Cortex-M )使用的,但是 Rust-Embedded 的大佬们同时还整了个叫 linux-embedded-hal 的 crate,可以在 Linux 上用使用了 embedded-hal 的库。
写了几天之后完成了基本的框架,想摸鱼的时候跟别人聊了几句,经过提醒想起来:
这个 ssd1306 的库用了另一个叫 Embedded Graphics 库,配合另一个叫 tinybmp 的 crate 能显示 bmp 图像。于是我就去 Niconico 下载了 Bad Apple,用 FFmpeg 魔法转换成了 6000 多张 BMP ( 30FPS,整个视频四分钟不到),配合一个 build.rs 把它嵌进了二进制里面。不过这么做写着是简单了,编译时间就爆炸一般得长,release build 花了快二十分钟。
可以看到 FPS 超低... 我也没啥好办法,直接用 FFmpeg 加速然后重新生成图片。我加速了 3.33333 倍(误),这次就只有 1000 多张图片了。这次重新编译就快多了,最后结果是这样的:
我觉得效果海星了,直接打包放到了 GitHub 上。
写完之后才知道 Linux 自己就有 SSD1306 的 framebuffer 驱动,改个设备树就能用,我太难了。
然后还有个问题是不知道为什么我 tinybmp 跟 Embedded Graphics 搭配使用的时候遇到了问题,最后用的还是 ImageRaw,估摸着这样的话经不经过 Embedded Graphics 我估计都已养了,我太难了。
最后就是... 本来想着能不用 std 的,后来想起来 linux-embedded-hal 自己就有在用 std,于是就放飞自我继续使用 std,我太难了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.