knvelina / prolite
ProLite PL-M2014R 协议
Requires
- php: >=7.0
- ext-intl: *
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-16 01:30:06 UTC
README
这是一个 Prolite PL-M2014R 协议的 PHP 实现。PL-M2014R 是一种电子 LED 显示屏。使用这个库,您可以创建页面、计时器和图形,并生成协议行以将它们传输到显示屏。
这个实现并不完整。
- 由于我们的固件版本不支持 trivia,因此不支持 trivia。
- 字符串转义有点过于激进。
- 特殊字符(或文档中称为的 欧洲字符)不会被自动转义,而是被翻译成它们的非特殊 ASCII 等效字符或简单地静音。
用法
首先安装库
composer require knevelina/prolite
首先使用正确的显示 ID 创建一个 Display
实例
<?php use Knevelina\Prolite\Display; $display = new Display(1);
现在使用图形库、页面库和计时器库来配置显示
$display->getGraphicsBank(); $display->getPageBank(); $display->getTimerBank();
最后,使用 getConfiguration(bool $reset = true): string
获取应发送到显示屏以应用配置的文本。默认情况下,$reset
参数(true
)将在应用配置之前重置显示。这强烈推荐。
$config = $display->getConfiguration();
现在应逐行将配置发送到显示。显示将响应其标识,然后在每个成功请求后跟一个新行。您必须等待此确认,否则显示将崩溃。
PHP 实际上无法写入串行端口,因此您可以考虑使用 Node.JS 或 Python 等其他方法来完成此操作。一个示例脚本,它使用 pySerial,包含在 examples/writetty.py
中。
页面库
Prolite 显示屏最重要的构建块是页面。显示屏可以存储多达 26 个页面。显示屏通过字母顺序标识它们;库通过它们的数字索引标识它们,从 0 开始。因此,页面 A 的索引为 0,页面 B 的索引为 1,依此类推,页面 Z 的索引为 25。
每个页面大约存储 1024 个字符,但此库强制执行 1000 个硬限制以确保安全。因此,您应该在设置之前自己拆分大型页面,否则将抛出异常。
与页面库的交互与您预期的简单一样
$pageBank = $display->getPageBank(); $pageBank->hasPage(0); // false $pageBank->setPage(0, 'Hello, world!'); $pageBank->hasPage(0); // false $pageBank->getPage(0); // Hello, world!
图形库
显示的 GraphicsBank
包含用户定义和默认图形。显示屏支持定义和使用 26 个不同图形,每个图形宽度为 18 像素,高度为 7 像素,由红色、黄色、绿色和黑色像素组成。图形定义为 126 个字符的字符串。
包含 26 个默认图形
您可以通过在消息中包含 <B_>
来使用内置图形,用您想使用的图形的字母替换 _
。
虽然有些图形很有用,但其他一些(如怪物、椅子和眼镜)相当无聊。幸运的是,您可以定义自己的图形。这是通过调用 setGraphic(int $index, Graphic $graphic)
来完成的。第一个参数是 Graphic
类的实例,它将图形规范作为其第一个也是唯一的参数
use Knevelina\Prolite\Models\Graphic; $graphicsBank = $display->getGraphicsBank(); $graphicsBank->setGraphic(0, new Graphic('RGYB...')); $display->getPageBank()->setPage(0, 'Hello, world! <BA>'); $graphicsBank->getGraphic(0); $graphicsBank->getGraphic(1); // Returns the default graphic at index 1.
计时器库
定时器库允许您在显示不同页面。该显示最多支持10个定时器。每个定时器都有一个应激活的星期、小时和分钟,以及定时器激活时显示的页面顺序。定时器是用于显示超过1000个字符的消息的解决方案。
时间设置的工作方式与cron作业类似,即您可以省略时间设置(通过将它们设置为-1)以指示定时器应随时激活。例如,要使定时器在每周每天凌晨2:30激活,分别使用-1、2和30作为星期、小时和分钟。
页面的顺序最多为32页;更多页面将被符号忽略并由库拒绝。您可以在一个顺序中多次使用一个页面。
$timerBank = $display->getTimerBank(); $timerBank->hasTimer(0); // false $timerBank->setTimer(0, new Timer(-1, 2, 30, [0, 1, 2, 3])); $timerBank->hasTimer(0); // true $timerBank->getTimer(0);
值得知道:始终激活的定时器(所有字段均为-1)仅在它完成了整个序列的显示后才会激活。换句话说,为了简单地将几页设置为循环,请将定时器设置为每分钟触发一次,这些页面作为序列。
当然,特定定时器的有用性仅当显示的时钟已正确设置时才存在。
// 2021-03-01, 12:30:27 $display->setDateTime(2021, 3, 1, 12, 30, 27);
格式化文本
DisplayText
类具有许多有用的DISPLAY_
、COLOR_
和FORMAT_
常量。
首先,DISPLAY_
常量更改了屏幕上文本的行为。您通过在页面内容中插入它们来使用它们,例如
use Knevelina\Prolite\DisplayText; $display->getPageBank()->setPage(0, sprintf('%sPoof!', DisplayText::DISPLAY_APPEAR));
各种显示常量的行为在它们的phpDoc中描述。
接下来,您可以使用COLOR_
常量设置文本颜色。您以与显示常量相同的方式使用它们。颜色会保持设置,直到设置另一个颜色或到达页面末尾。
最后,您可以使用FORMAT_
常量设置文本的格式。format(bool $flashing, bool $italic, bool $bold): string
函数可以帮助您找到正确的常量,例如在GUI中让用户选择他们的格式时。
use Knevelina\Prolite\DisplayText; $display->getPageBank()->setPage(0, sprintf('%sThat is very bold of you.', DisplayText::format(false, false, true)));
其他有用功能
许多您期望在符号上工作的特殊字符和其他东西都不起作用。符号只支持ASCII的有限子集。为了帮助您为符号制作正确的消息,DisplayText
类有两个非常实用的函数。
escape(string $string): string
函数将字符串转义以从特殊命令中删除它。当您将用户输入显示在符号上时,您绝对应该通过此函数传递。
normalize(string $string): string
函数修改一个字符串以将其减少到符号允许的字符集。它尝试在将特殊字符转换为它们的ASCII等效字符的同时完成此操作。例如,mon frère a acheté de la crème fraîche将更改为mon frere a achete de la creme fraiche
。
贡献
一些指南
- 此库遵循PSR-1和PSR-12编码风格。
- 新代码应有测试来确认代码的工作。
- 测试是“干”的,也就是说,我不会在实际符号上运行代码。然而,测试案例是基于与符号的真实经验。当添加新测试时,请包括您实际上在符号上测试配置的证据。
许可证
MIT。见LICENSE。