poe-svelte-ui-lib 1.66.0 → 1.67.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/protocols/crc.d.ts +0 -1
- package/dist/protocols/crc.js +2 -26
- package/dist/protocols/index.d.ts +1 -1
- package/dist/protocols/index.js +1 -1
- package/dist/protocols/poeSerial.js +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ npm install poe-svelte-ui-lib
|
|
|
59
59
|
|
|
60
60
|
**Названия смарт-виджетов** — в словаре библиотеки на всех языках (WiFi, «Об устройстве», «Файловая система», «Стек и задачи», «RGB лента», «Пилотажный дисплей», «Карта»); пустой `label.name` показывает название на языке пользователя, `widgetTitle(type)` отдаёт его сразу на всех языках `{ ru, en, zh }` — так конструктор заполняет заголовок нового виджета.
|
|
61
61
|
|
|
62
|
-
**Ядро протоколов** — `poe-svelte-ui-lib/protocols` (без Svelte, работает и под Node без Vite): общий для DevCloud, WebApp и SYP-DevTerminal CBOR-кодек (RFC 8949) — `encodeCbor`/`decodeCbor`, `CborEncoder`/`CborDecoder`; `valueToCbor`/`cborToValue` — обычные значения, двоичные данные как `Uint8Array` (WebSocket, хранилище, телеметрия); `jsonToCbor`/`cborToJson` — JSON-совместимые значения, двоичные данные в base64, строки под ключами с `BIN` — байты (поля ввода терминала и отладки). Пакет `poe_cbor_pkt` `{ TrgBusID : [RetBusID, HA_Code, Payload, CRC16] }` (CAN, RS485): `encodePacket`/`decodePacket` (разбор с начала буфера — `complete` с длиной, `incomplete` для потока или `garbage`; объекты с одинаковым `TrgBusID` не склеиваются, неверный CRC — флаг `crcOk`), `objectsFor` (свой адрес и broadcast `0xFFFF`), `makeHaCode`/`splitHaCode`, `packetObjectCrc`; контрольные суммы `crc16Kermit` и `crc8Rohc
|
|
62
|
+
**Ядро протоколов** — `poe-svelte-ui-lib/protocols` (без Svelte, работает и под Node без Vite): общий для DevCloud, WebApp и SYP-DevTerminal CBOR-кодек (RFC 8949) — `encodeCbor`/`decodeCbor`, `CborEncoder`/`CborDecoder`; `valueToCbor`/`cborToValue` — обычные значения, двоичные данные как `Uint8Array` (WebSocket, хранилище, телеметрия); `jsonToCbor`/`cborToJson` — JSON-совместимые значения, двоичные данные в base64, строки под ключами с `BIN` — байты (поля ввода терминала и отладки). Пакет `poe_cbor_pkt` `{ TrgBusID : [RetBusID, HA_Code, Payload, CRC16] }` (CAN, RS485): `encodePacket`/`decodePacket` (разбор с начала буфера — `complete` с длиной, `incomplete` для потока или `garbage`; объекты с одинаковым `TrgBusID` не склеиваются, неверный CRC — флаг `crcOk`), `objectsFor` (свой адрес и broadcast `0xFFFF`), `makeHaCode`/`splitHaCode`, `packetObjectCrc`; контрольные суммы `crc16Kermit` и `crc8Rohc` — строго побайтные, как в `common.c` прошивок. Байты совпадают с `poe_cbor_pkt.c` прошивки — проверка `npm run TestProtocols` (`tests/protocols.test.mjs`, эталонные пакеты собраны прошивочным кодом). Рамка POESerial (UART-консоль `system_console`, `[SOH] HDR [US] ARG [STX] VAL [ETX] CRC8 [US] FHS [EOT]`): `encodePoeSerialFrame` — команда устройству, `createPoeSerialParser().push(байты)` — потоковый разбор кадров, строк Teleplot (`plot`) и прочего текста (`raw`), с проверкой CRC `crc8Rohc` строго побайтно, как `crc8_rohc` в `common.c` прошивок. CAN/CAN FD через slcan-адаптер (`can_service` прошивки): `canFragments`/`encodeCanPacket` — нарезка пакета на кадры как `CAN_Send` (бит 10 ID — «последний», биты 0..9 — `packetId`, по 8 / 64 байта), `encodeSlcanFrame`, `createCanParser().push(байты)` — разбор кадров slcan со сборкой фрагментов и обрезкой паддинга CAN FD. RS485 — сырой поток пакетов: `createPacketStreamParser().push(байты)` (пауза обрывает недособранное, мусор пропускается по байту). Открытие slcan-адаптера — `slcanOpenCommands(скорость, скоростьДанных?)`. Поле Value команды POESerial из ввода — `poeSerialValueFromText` (hex как есть, JSON → CBOR). Словарь протокола — `HEADER_CODES`, `DEFAULT_ARGUMENT_CODES` (из `.framework/Dictionary.yaml` прошивок), `parseArgumentDictionary` (строки `- [Строка, Enum, Число]`), `nameByCode`. Своих копий протоколов и словаря в приложениях не держим: терминал и отладка облака читают и пишут порт сырыми байтами, разбор и сборка — здесь.
|
|
63
63
|
|
|
64
64
|
**Шапка смарт-виджета** (`WidgetHeader`): значок, заголовок и сворачивание слева, «?» в правом краю; правая часть (режимы, «Обновить» и т. п.) стоит в той же строке, а если не помещается — уходит второй строкой под заголовок и там переносится.
|
|
65
65
|
|
package/dist/protocols/crc.d.ts
CHANGED
package/dist/protocols/crc.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* $lib/protocols/crc.ts */
|
|
2
|
-
/* Контрольные суммы протоколов устройств — побайтные, как в
|
|
2
|
+
/* Контрольные суммы протоколов устройств — строго побайтные, как crc8_rohc/crc16_kermit в common.c прошивок (ProdFactory-ESP/STM) */
|
|
3
3
|
/* CRC-16/KERMIT: poly 0x1021 reflected (0x8408), init 0x0000, xorout 0x0000, check("123456789") = 0x2189 — объекты пакета poe_cbor_pkt */
|
|
4
4
|
export const crc16Kermit = (crc, bytes) => {
|
|
5
5
|
for (const byte of bytes) {
|
|
@@ -9,7 +9,7 @@ export const crc16Kermit = (crc, bytes) => {
|
|
|
9
9
|
}
|
|
10
10
|
return crc & 0xffff;
|
|
11
11
|
};
|
|
12
|
-
/* CRC-8/ROHC: poly 0x07 reflected (0xE0), init 0xFF, xorout 0x00, check("123456789") = 0xD0 — рамка POESerial (system_console) */
|
|
12
|
+
/* CRC-8/ROHC: poly 0x07 reflected (0xE0), init 0xFF, xorout 0x00, check("123456789") = 0xD0 — рамка POESerial (system_console): HEADER, ARGUMENT, VALUE */
|
|
13
13
|
export const crc8Rohc = (crc, bytes) => {
|
|
14
14
|
for (const byte of bytes) {
|
|
15
15
|
crc ^= byte & 0xff;
|
|
@@ -18,27 +18,3 @@ export const crc8Rohc = (crc, bytes) => {
|
|
|
18
18
|
}
|
|
19
19
|
return crc & 0xff;
|
|
20
20
|
};
|
|
21
|
-
/* Байт для CRC от позиции pos по правилу прошивки (common.c, utf8_seq_byte): целая UTF-8-последовательность даёт младший байт
|
|
22
|
-
своего code point, иначе байт как есть — так прошивка считает CRC и по тексту с эмодзи, и по сырому CBOR */
|
|
23
|
-
const utf8SeqByte = (bytes, pos) => {
|
|
24
|
-
const first = bytes[pos];
|
|
25
|
-
const cont = (offset) => (bytes[pos + offset] & 0xc0) === 0x80;
|
|
26
|
-
if ((first & 0x80) === 0)
|
|
27
|
-
return { data: first, length: 1 };
|
|
28
|
-
if ((first & 0xe0) === 0xc0 && pos + 1 < bytes.length && cont(1))
|
|
29
|
-
return { data: (((first & 0x1f) << 6) | (bytes[pos + 1] & 0x3f)) & 0xff, length: 2 };
|
|
30
|
-
if ((first & 0xf0) === 0xe0 && pos + 2 < bytes.length && cont(1) && cont(2))
|
|
31
|
-
return { data: (((first & 0x0f) << 12) | ((bytes[pos + 1] & 0x3f) << 6) | (bytes[pos + 2] & 0x3f)) & 0xff, length: 3 };
|
|
32
|
-
if ((first & 0xf8) === 0xf0 && pos + 3 < bytes.length && cont(1) && cont(2) && cont(3))
|
|
33
|
-
return { data: (((bytes[pos + 1] & 0x3f) << 12) | ((bytes[pos + 2] & 0x3f) << 6) | (bytes[pos + 3] & 0x3f)) & 0xff, length: 4 };
|
|
34
|
-
return { data: first, length: 1 };
|
|
35
|
-
};
|
|
36
|
-
/* CRC-8/ROHC по правилу прошивки для UTF-8 (crc8_rohc в common.c) — рамка POESerial: HEADER, ARGUMENT, VALUE */
|
|
37
|
-
export const crc8RohcUtf8 = (crc, bytes) => {
|
|
38
|
-
for (let pos = 0; pos < bytes.length;) {
|
|
39
|
-
const { data, length } = utf8SeqByte(bytes, pos);
|
|
40
|
-
crc = crc8Rohc(crc, [data]);
|
|
41
|
-
pos += length;
|
|
42
|
-
}
|
|
43
|
-
return crc;
|
|
44
|
-
};
|
|
@@ -4,7 +4,7 @@ export { CborEncoder, encodeCbor } from "./cbor/encoder.js";
|
|
|
4
4
|
export { bytesToBase64, base64ToBytes } from "./cbor/base64.js";
|
|
5
5
|
export { CborToValue, ValueToCbor, cborToValue, valueToCbor } from "./cbor/value.js";
|
|
6
6
|
export { CborToJson, JsonToCbor, cborToJson, jsonToCbor } from "./cbor/json.js";
|
|
7
|
-
export { crc16Kermit, crc8Rohc
|
|
7
|
+
export { crc16Kermit, crc8Rohc } from "./crc.js";
|
|
8
8
|
export { BROADCAST_BUS_ID, makeHaCode, splitHaCode, packetObjectCrc, encodePacket, decodePacket, objectsFor, createPacketStreamParser, type PacketObject, type DecodedPacketObject, type PacketParse, } from "./packet.js";
|
|
9
9
|
export { encodePoeSerialFrame, createPoeSerialParser, poeSerialValueFromText, type PoeSerialItem } from "./poeSerial.js";
|
|
10
10
|
export { CAN_FINAL_BIT, CAN_PACKET_ID_MASK, canFragments, encodeSlcanFrame, encodeCanPacket, createCanParser, slcanOpenCommands, type CanFrame, type CanMessage, } from "./can.js";
|
package/dist/protocols/index.js
CHANGED
|
@@ -10,7 +10,7 @@ export { CborToValue, ValueToCbor, cborToValue, valueToCbor } from "./cbor/value
|
|
|
10
10
|
/* JSON-текст ↔ CBOR: двоичные данные — base64, ключи с "BIN" кодируются байтами (поля ввода терминала и отладки) */
|
|
11
11
|
export { CborToJson, JsonToCbor, cborToJson, jsonToCbor } from "./cbor/json.js";
|
|
12
12
|
/* Контрольные суммы и пакет poe_cbor_pkt { TrgBusID : [RetBusID, HA_Code, Payload, CRC16] } (CAN, RS485) */
|
|
13
|
-
export { crc16Kermit, crc8Rohc
|
|
13
|
+
export { crc16Kermit, crc8Rohc } from "./crc.js";
|
|
14
14
|
export { BROADCAST_BUS_ID, makeHaCode, splitHaCode, packetObjectCrc, encodePacket, decodePacket, objectsFor, createPacketStreamParser, } from "./packet.js";
|
|
15
15
|
/* Рамка POESerial (UART-консоль system_console): сборка команды и потоковый разбор кадров, строк Teleplot и текста */
|
|
16
16
|
export { encodePoeSerialFrame, createPoeSerialParser, poeSerialValueFromText } from "./poeSerial.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* $lib/protocols/poeSerial.ts */
|
|
2
2
|
/* Рамка POESerial (system_console прошивки): [SOH] HEADER [US] ARGUMENT [STX] VALUE [ETX] CRC8 [US] FHS [EOT] \n — CRC8 двумя hex-символами
|
|
3
|
-
по HEADER+ARGUMENT+VALUE (
|
|
3
|
+
по HEADER+ARGUMENT+VALUE (crc8Rohc), FHS (свободная куча) только у кадров устройства. Устройство шлёт VALUE текстом (лог или hex-дамп CBOR),
|
|
4
4
|
устройству VALUE уходит сырыми байтами CBOR. Между кадрами — текст: строки Teleplot «>Имя:Значение» (PLOT) и прочий вывод (RAW) */
|
|
5
|
-
import {
|
|
5
|
+
import { crc8Rohc } from "./crc.js";
|
|
6
6
|
import { jsonToCbor } from "./cbor/json.js";
|
|
7
7
|
export const SOH = 0x01;
|
|
8
8
|
export const STX = 0x02;
|
|
@@ -20,7 +20,7 @@ const hex2 = (value) => value.toString(16).toUpperCase().padStart(2, "0");
|
|
|
20
20
|
export const encodePoeSerialFrame = (header, argument, value) => {
|
|
21
21
|
const headerBytes = encoder.encode(header);
|
|
22
22
|
const argumentBytes = encoder.encode(argument);
|
|
23
|
-
const crc =
|
|
23
|
+
const crc = crc8Rohc(crc8Rohc(crc8Rohc(0xff, headerBytes), argumentBytes), value);
|
|
24
24
|
return new Uint8Array([SOH, ...headerBytes, US, ...argumentBytes, STX, ...value, ETX, ...encoder.encode(hex2(crc)), EOT]);
|
|
25
25
|
};
|
|
26
26
|
/* Строки текста вне кадров: Teleplot «>Имя:Значение» → plot, остальное → raw; пустые и с управляющими символами пропускаются */
|
|
@@ -46,7 +46,7 @@ const frameItem = (frame) => {
|
|
|
46
46
|
const tailUs = frame.indexOf(US, etx + 1);
|
|
47
47
|
const crc = decoder.decode(frame.subarray(etx + 1, tailUs < 0 ? frame.length - 1 : tailUs)).trim();
|
|
48
48
|
const freeHeap = tailUs < 0 ? "" : decoder.decode(frame.subarray(tailUs + 1, frame.length - 1)).trim();
|
|
49
|
-
const crcCalc =
|
|
49
|
+
const crcCalc = crc8Rohc(crc8Rohc(crc8Rohc(0xff, header), argument), valueBytes);
|
|
50
50
|
return {
|
|
51
51
|
type: "frame",
|
|
52
52
|
header: decoder.decode(header),
|