knvelina/prolite

ProLite PL-M2014R 协议

1.0.0 2021-02-15 17:11 UTC

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 个默认图形

The 26 default graphics.

您可以通过在消息中包含 <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