zigbee-herdsman 6.0.1 → 6.0.3
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/CHANGELOG.md +16 -0
- package/dist/adapter/ezsp/driver/uart.js +1 -1
- package/dist/adapter/ezsp/driver/uart.js.map +1 -1
- package/dist/adapter/z-stack/adapter/zStackAdapter.js +4 -4
- package/dist/adapter/z-stack/adapter/zStackAdapter.js.map +1 -1
- package/dist/adapter/zigate/adapter/zigateAdapter.js +4 -4
- package/dist/adapter/zigate/adapter/zigateAdapter.js.map +1 -1
- package/dist/controller/model/device.d.ts.map +1 -1
- package/dist/controller/model/device.js +1 -0
- package/dist/controller/model/device.js.map +1 -1
- package/package.json +14 -6
- package/.github/ISSUE_TEMPLATE/config.yml +0 -5
- package/.github/dependabot.yml +0 -22
- package/.github/workflows/ci.yml +0 -64
- package/.github/workflows/release-please.yml +0 -18
- package/.github/workflows/stale.yml +0 -20
- package/.github/workflows/typedoc.yaml +0 -47
- package/.release-please-manifest.json +0 -3
- package/.vscode/extensions.json +0 -3
- package/.vscode/settings.json +0 -11
- package/biome.json +0 -98
- package/examples/join-and-log.js +0 -24
- package/release-please-config.json +0 -9
- package/src/adapter/adapter.ts +0 -189
- package/src/adapter/adapterDiscovery.ts +0 -666
- package/src/adapter/const.ts +0 -12
- package/src/adapter/deconz/adapter/deconzAdapter.ts +0 -877
- package/src/adapter/deconz/driver/constants.ts +0 -246
- package/src/adapter/deconz/driver/driver.ts +0 -1540
- package/src/adapter/deconz/driver/frame.ts +0 -11
- package/src/adapter/deconz/driver/frameParser.ts +0 -753
- package/src/adapter/deconz/driver/parser.ts +0 -45
- package/src/adapter/deconz/driver/writer.ts +0 -22
- package/src/adapter/deconz/types.d.ts +0 -13
- package/src/adapter/ember/adapter/emberAdapter.ts +0 -2265
- package/src/adapter/ember/adapter/endpoints.ts +0 -86
- package/src/adapter/ember/adapter/oneWaitress.ts +0 -324
- package/src/adapter/ember/adapter/tokensManager.ts +0 -782
- package/src/adapter/ember/consts.ts +0 -178
- package/src/adapter/ember/enums.ts +0 -1746
- package/src/adapter/ember/ezsp/buffalo.ts +0 -1392
- package/src/adapter/ember/ezsp/consts.ts +0 -148
- package/src/adapter/ember/ezsp/enums.ts +0 -1114
- package/src/adapter/ember/ezsp/ezsp.ts +0 -9061
- package/src/adapter/ember/ezspError.ts +0 -10
- package/src/adapter/ember/types.ts +0 -866
- package/src/adapter/ember/uart/ash.ts +0 -1960
- package/src/adapter/ember/uart/consts.ts +0 -109
- package/src/adapter/ember/uart/enums.ts +0 -192
- package/src/adapter/ember/uart/parser.ts +0 -48
- package/src/adapter/ember/uart/queues.ts +0 -247
- package/src/adapter/ember/uart/writer.ts +0 -53
- package/src/adapter/ember/utils/initters.ts +0 -58
- package/src/adapter/ember/utils/math.ts +0 -73
- package/src/adapter/events.ts +0 -21
- package/src/adapter/ezsp/adapter/backup.ts +0 -109
- package/src/adapter/ezsp/adapter/ezspAdapter.ts +0 -614
- package/src/adapter/ezsp/driver/commands.ts +0 -2497
- package/src/adapter/ezsp/driver/consts.ts +0 -11
- package/src/adapter/ezsp/driver/driver.ts +0 -1002
- package/src/adapter/ezsp/driver/ezsp.ts +0 -802
- package/src/adapter/ezsp/driver/frame.ts +0 -101
- package/src/adapter/ezsp/driver/index.ts +0 -4
- package/src/adapter/ezsp/driver/multicast.ts +0 -78
- package/src/adapter/ezsp/driver/parser.ts +0 -81
- package/src/adapter/ezsp/driver/types/basic.ts +0 -201
- package/src/adapter/ezsp/driver/types/index.ts +0 -239
- package/src/adapter/ezsp/driver/types/named.ts +0 -2330
- package/src/adapter/ezsp/driver/types/struct.ts +0 -844
- package/src/adapter/ezsp/driver/uart.ts +0 -460
- package/src/adapter/ezsp/driver/utils/crc16ccitt.ts +0 -44
- package/src/adapter/ezsp/driver/utils/index.ts +0 -32
- package/src/adapter/ezsp/driver/writer.ts +0 -64
- package/src/adapter/index.ts +0 -3
- package/src/adapter/serialPort.ts +0 -58
- package/src/adapter/socketPortUtils.ts +0 -16
- package/src/adapter/tstype.ts +0 -78
- package/src/adapter/z-stack/adapter/adapter-backup.ts +0 -519
- package/src/adapter/z-stack/adapter/adapter-nv-memory.ts +0 -457
- package/src/adapter/z-stack/adapter/endpoints.ts +0 -57
- package/src/adapter/z-stack/adapter/manager.ts +0 -543
- package/src/adapter/z-stack/adapter/tstype.ts +0 -6
- package/src/adapter/z-stack/adapter/zStackAdapter.ts +0 -1190
- package/src/adapter/z-stack/constants/af.ts +0 -27
- package/src/adapter/z-stack/constants/common.ts +0 -285
- package/src/adapter/z-stack/constants/dbg.ts +0 -23
- package/src/adapter/z-stack/constants/index.ts +0 -11
- package/src/adapter/z-stack/constants/mac.ts +0 -128
- package/src/adapter/z-stack/constants/sapi.ts +0 -25
- package/src/adapter/z-stack/constants/sys.ts +0 -72
- package/src/adapter/z-stack/constants/util.ts +0 -82
- package/src/adapter/z-stack/constants/utils.ts +0 -14
- package/src/adapter/z-stack/constants/zdo.ts +0 -103
- package/src/adapter/z-stack/models/startup-options.ts +0 -13
- package/src/adapter/z-stack/structs/entries/address-manager-entry.ts +0 -44
- package/src/adapter/z-stack/structs/entries/address-manager-table.ts +0 -19
- package/src/adapter/z-stack/structs/entries/aps-link-key-data-entry.ts +0 -12
- package/src/adapter/z-stack/structs/entries/aps-link-key-data-table.ts +0 -21
- package/src/adapter/z-stack/structs/entries/aps-tc-link-key-entry.ts +0 -19
- package/src/adapter/z-stack/structs/entries/aps-tc-link-key-table.ts +0 -21
- package/src/adapter/z-stack/structs/entries/channel-list.ts +0 -8
- package/src/adapter/z-stack/structs/entries/has-configured.ts +0 -16
- package/src/adapter/z-stack/structs/entries/index.ts +0 -16
- package/src/adapter/z-stack/structs/entries/nib.ts +0 -66
- package/src/adapter/z-stack/structs/entries/nwk-key-descriptor.ts +0 -15
- package/src/adapter/z-stack/structs/entries/nwk-key.ts +0 -13
- package/src/adapter/z-stack/structs/entries/nwk-pan-id.ts +0 -8
- package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-entry.ts +0 -20
- package/src/adapter/z-stack/structs/entries/nwk-sec-material-descriptor-table.ts +0 -19
- package/src/adapter/z-stack/structs/entries/security-manager-entry.ts +0 -33
- package/src/adapter/z-stack/structs/entries/security-manager-table.ts +0 -22
- package/src/adapter/z-stack/structs/index.ts +0 -4
- package/src/adapter/z-stack/structs/serializable-memory-object.ts +0 -14
- package/src/adapter/z-stack/structs/struct.ts +0 -367
- package/src/adapter/z-stack/structs/table.ts +0 -198
- package/src/adapter/z-stack/unpi/constants.ts +0 -33
- package/src/adapter/z-stack/unpi/frame.ts +0 -62
- package/src/adapter/z-stack/unpi/index.ts +0 -4
- package/src/adapter/z-stack/unpi/parser.ts +0 -56
- package/src/adapter/z-stack/unpi/writer.ts +0 -21
- package/src/adapter/z-stack/utils/channel-list.ts +0 -40
- package/src/adapter/z-stack/utils/index.ts +0 -2
- package/src/adapter/z-stack/utils/network-options.ts +0 -26
- package/src/adapter/z-stack/znp/buffaloZnp.ts +0 -175
- package/src/adapter/z-stack/znp/definition.ts +0 -2713
- package/src/adapter/z-stack/znp/index.ts +0 -2
- package/src/adapter/z-stack/znp/parameterType.ts +0 -22
- package/src/adapter/z-stack/znp/tstype.ts +0 -44
- package/src/adapter/z-stack/znp/utils.ts +0 -10
- package/src/adapter/z-stack/znp/znp.ts +0 -342
- package/src/adapter/z-stack/znp/zpiObject.ts +0 -148
- package/src/adapter/zboss/adapter/zbossAdapter.ts +0 -526
- package/src/adapter/zboss/commands.ts +0 -1184
- package/src/adapter/zboss/consts.ts +0 -9
- package/src/adapter/zboss/driver.ts +0 -422
- package/src/adapter/zboss/enums.ts +0 -360
- package/src/adapter/zboss/frame.ts +0 -227
- package/src/adapter/zboss/reader.ts +0 -65
- package/src/adapter/zboss/types.ts +0 -0
- package/src/adapter/zboss/uart.ts +0 -428
- package/src/adapter/zboss/utils.ts +0 -58
- package/src/adapter/zboss/writer.ts +0 -49
- package/src/adapter/zigate/adapter/patchZdoBuffaloBE.ts +0 -27
- package/src/adapter/zigate/adapter/zigateAdapter.ts +0 -618
- package/src/adapter/zigate/driver/LICENSE +0 -17
- package/src/adapter/zigate/driver/buffaloZiGate.ts +0 -212
- package/src/adapter/zigate/driver/commandType.ts +0 -418
- package/src/adapter/zigate/driver/constants.ts +0 -150
- package/src/adapter/zigate/driver/frame.ts +0 -197
- package/src/adapter/zigate/driver/messageType.ts +0 -287
- package/src/adapter/zigate/driver/parameterType.ts +0 -32
- package/src/adapter/zigate/driver/ziGateObject.ts +0 -146
- package/src/adapter/zigate/driver/zigate.ts +0 -423
- package/src/adapter/zoh/adapter/utils.ts +0 -27
- package/src/adapter/zoh/adapter/zohAdapter.ts +0 -838
- package/src/buffalo/buffalo.ts +0 -342
- package/src/buffalo/index.ts +0 -1
- package/src/controller/controller.ts +0 -1022
- package/src/controller/database.ts +0 -124
- package/src/controller/events.ts +0 -52
- package/src/controller/greenPower.ts +0 -603
- package/src/controller/helpers/index.ts +0 -1
- package/src/controller/helpers/installCodes.ts +0 -107
- package/src/controller/helpers/request.ts +0 -96
- package/src/controller/helpers/requestQueue.ts +0 -125
- package/src/controller/helpers/zclFrameConverter.ts +0 -47
- package/src/controller/helpers/zclTransactionSequenceNumber.ts +0 -19
- package/src/controller/index.ts +0 -6
- package/src/controller/model/device.ts +0 -1248
- package/src/controller/model/endpoint.ts +0 -1105
- package/src/controller/model/entity.ts +0 -23
- package/src/controller/model/group.ts +0 -424
- package/src/controller/model/index.ts +0 -5
- package/src/controller/model/zigbeeEntity.ts +0 -30
- package/src/controller/touchlink.ts +0 -189
- package/src/controller/tstype.ts +0 -274
- package/src/index.ts +0 -12
- package/src/models/backup-storage-legacy.ts +0 -48
- package/src/models/backup-storage-unified.ts +0 -47
- package/src/models/backup.ts +0 -37
- package/src/models/index.ts +0 -5
- package/src/models/network-options.ts +0 -11
- package/src/utils/backup.ts +0 -152
- package/src/utils/index.ts +0 -5
- package/src/utils/logger.ts +0 -20
- package/src/utils/patchBigIntSerialization.ts +0 -8
- package/src/utils/queue.ts +0 -76
- package/src/utils/types.d.ts +0 -3
- package/src/utils/utils.ts +0 -19
- package/src/utils/wait.ts +0 -5
- package/src/utils/waitress.ts +0 -96
- package/src/zspec/consts.ts +0 -84
- package/src/zspec/enums.ts +0 -22
- package/src/zspec/index.ts +0 -3
- package/src/zspec/tstypes.ts +0 -18
- package/src/zspec/utils.ts +0 -247
- package/src/zspec/zcl/buffaloZcl.ts +0 -1220
- package/src/zspec/zcl/definition/cluster.ts +0 -5915
- package/src/zspec/zcl/definition/clusters-typegen.ts +0 -588
- package/src/zspec/zcl/definition/clusters-types.ts +0 -7331
- package/src/zspec/zcl/definition/consts.ts +0 -24
- package/src/zspec/zcl/definition/enums.ts +0 -203
- package/src/zspec/zcl/definition/foundation.ts +0 -329
- package/src/zspec/zcl/definition/manufacturerCode.ts +0 -729
- package/src/zspec/zcl/definition/status.ts +0 -69
- package/src/zspec/zcl/definition/tstype.ts +0 -377
- package/src/zspec/zcl/index.ts +0 -11
- package/src/zspec/zcl/utils.ts +0 -321
- package/src/zspec/zcl/zclFrame.ts +0 -356
- package/src/zspec/zcl/zclHeader.ts +0 -102
- package/src/zspec/zcl/zclStatusError.ts +0 -10
- package/src/zspec/zdo/buffaloZdo.ts +0 -2336
- package/src/zspec/zdo/definition/clusters.ts +0 -722
- package/src/zspec/zdo/definition/consts.ts +0 -16
- package/src/zspec/zdo/definition/enums.ts +0 -99
- package/src/zspec/zdo/definition/status.ts +0 -105
- package/src/zspec/zdo/definition/tstypes.ts +0 -1062
- package/src/zspec/zdo/index.ts +0 -7
- package/src/zspec/zdo/utils.ts +0 -76
- package/src/zspec/zdo/zdoStatusError.ts +0 -10
- package/test/adapter/adapter.test.ts +0 -1062
- package/test/adapter/ember/ash.test.ts +0 -337
- package/test/adapter/ember/consts.ts +0 -131
- package/test/adapter/ember/emberAdapter.test.ts +0 -3449
- package/test/adapter/ember/ezsp.test.ts +0 -385
- package/test/adapter/ember/ezspBuffalo.test.ts +0 -93
- package/test/adapter/ember/ezspError.test.ts +0 -12
- package/test/adapter/ember/math.test.ts +0 -206
- package/test/adapter/ezsp/frame.test.ts +0 -30
- package/test/adapter/ezsp/uart.test.ts +0 -181
- package/test/adapter/z-stack/adapter.test.ts +0 -3984
- package/test/adapter/z-stack/constants.test.ts +0 -33
- package/test/adapter/z-stack/structs.test.ts +0 -115
- package/test/adapter/z-stack/unpi.test.ts +0 -213
- package/test/adapter/z-stack/znp.test.ts +0 -1284
- package/test/adapter/zboss/fixZdoResponse.test.ts +0 -179
- package/test/adapter/zigate/patchZdoBuffaloBE.test.ts +0 -81
- package/test/adapter/zigate/zdo.test.ts +0 -187
- package/test/adapter/zoh/utils.test.ts +0 -36
- package/test/adapter/zoh/zohAdapter.test.ts +0 -1307
- package/test/buffalo.test.ts +0 -431
- package/test/controller.bench.ts +0 -193
- package/test/controller.test.ts +0 -8702
- package/test/greenpower.test.ts +0 -1408
- package/test/mockAdapters.ts +0 -65
- package/test/mockDevices.ts +0 -598
- package/test/requests.bench.ts +0 -206
- package/test/testUtils.ts +0 -20
- package/test/tsconfig.json +0 -9
- package/test/utils/math.ts +0 -19
- package/test/utils.test.ts +0 -279
- package/test/vitest.config.mts +0 -27
- package/test/zcl.test.ts +0 -2831
- package/test/zspec/utils.test.ts +0 -68
- package/test/zspec/zcl/buffalo.test.ts +0 -1374
- package/test/zspec/zcl/frame.test.ts +0 -960
- package/test/zspec/zcl/utils.test.ts +0 -273
- package/test/zspec/zdo/buffalo.test.ts +0 -1850
- package/test/zspec/zdo/utils.test.ts +0 -241
- package/tsconfig.json +0 -24
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
/* v8 ignore start */
|
|
2
|
-
|
|
3
|
-
import EventEmitter from "node:events";
|
|
4
|
-
import {Socket} from "node:net";
|
|
5
|
-
|
|
6
|
-
import {Queue, Waitress, wait} from "../../utils";
|
|
7
|
-
import {logger} from "../../utils/logger";
|
|
8
|
-
import {SerialPort} from "../serialPort";
|
|
9
|
-
import SocketPortUtils from "../socketPortUtils";
|
|
10
|
-
import type {SerialPortOptions} from "../tstype";
|
|
11
|
-
import {SIGNATURE, ZBOSS_FLAG_FIRST_FRAGMENT, ZBOSS_FLAG_LAST_FRAGMENT, ZBOSS_NCP_API_HL} from "./consts";
|
|
12
|
-
import {readZBOSSFrame, writeZBOSSFrame, type ZBOSSFrame} from "./frame";
|
|
13
|
-
import {ZBOSSReader} from "./reader";
|
|
14
|
-
import {crc8, crc16} from "./utils";
|
|
15
|
-
import {ZBOSSWriter} from "./writer";
|
|
16
|
-
|
|
17
|
-
const NS = "zh:zboss:uart";
|
|
18
|
-
|
|
19
|
-
export class ZBOSSUart extends EventEmitter {
|
|
20
|
-
private readonly portOptions: SerialPortOptions;
|
|
21
|
-
private serialPort?: SerialPort;
|
|
22
|
-
private socketPort?: Socket;
|
|
23
|
-
private writer: ZBOSSWriter;
|
|
24
|
-
private reader: ZBOSSReader;
|
|
25
|
-
private closing = false;
|
|
26
|
-
private sendSeq = 0; // next frame number to send
|
|
27
|
-
private recvSeq = 0; // next frame number to receive
|
|
28
|
-
private ackSeq = 0; // next number after the last accepted frame
|
|
29
|
-
private waitress: Waitress<number, number>;
|
|
30
|
-
private queue: Queue;
|
|
31
|
-
public inReset = false;
|
|
32
|
-
|
|
33
|
-
constructor(options: SerialPortOptions) {
|
|
34
|
-
super();
|
|
35
|
-
|
|
36
|
-
this.portOptions = options;
|
|
37
|
-
this.serialPort = undefined;
|
|
38
|
-
this.socketPort = undefined;
|
|
39
|
-
this.writer = new ZBOSSWriter();
|
|
40
|
-
this.reader = new ZBOSSReader();
|
|
41
|
-
this.reader.on("data", this.onPackage.bind(this));
|
|
42
|
-
this.queue = new Queue(1);
|
|
43
|
-
this.waitress = new Waitress<number, number>(this.waitressValidator, this.waitressTimeoutFormatter);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
public async resetNcp(): Promise<boolean> {
|
|
47
|
-
if (this.closing) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
logger.info("NCP reset", NS);
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
if (!this.portOpen) {
|
|
55
|
-
await this.openPort();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return true;
|
|
59
|
-
} catch (err) {
|
|
60
|
-
logger.error(`Failed to init port with error ${err}`, NS);
|
|
61
|
-
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
get portOpen(): boolean | undefined {
|
|
67
|
-
if (this.closing) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
71
|
-
if (SocketPortUtils.isTcpPath(this.portOptions.path!)) {
|
|
72
|
-
return this.socketPort && !this.socketPort.closed;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return this.serialPort?.isOpen;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
public async start(): Promise<boolean> {
|
|
79
|
-
if (!this.portOpen) {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
logger.info("UART starting", NS);
|
|
84
|
-
|
|
85
|
-
try {
|
|
86
|
-
if (this.serialPort != null) {
|
|
87
|
-
// clear read/write buffers
|
|
88
|
-
await this.serialPort.asyncFlush();
|
|
89
|
-
}
|
|
90
|
-
} catch (err) {
|
|
91
|
-
logger.error(`Error while flushing before start: ${err}`, NS);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
public async stop(): Promise<void> {
|
|
98
|
-
this.closing = true;
|
|
99
|
-
this.queue.clear();
|
|
100
|
-
await this.closePort();
|
|
101
|
-
this.closing = false;
|
|
102
|
-
logger.info("UART stopped", NS);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private async openPort(): Promise<void> {
|
|
106
|
-
await this.closePort();
|
|
107
|
-
|
|
108
|
-
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
109
|
-
if (!SocketPortUtils.isTcpPath(this.portOptions.path!)) {
|
|
110
|
-
const serialOpts = {
|
|
111
|
-
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
112
|
-
path: this.portOptions.path!,
|
|
113
|
-
baudRate: typeof this.portOptions.baudRate === "number" ? this.portOptions.baudRate : 115200,
|
|
114
|
-
rtscts: typeof this.portOptions.rtscts === "boolean" ? this.portOptions.rtscts : false,
|
|
115
|
-
autoOpen: false,
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
//@ts-expect-error Jest testing
|
|
119
|
-
if (this.portOptions.binding != null) {
|
|
120
|
-
//@ts-expect-error Jest testing
|
|
121
|
-
serialOpts.binding = this.portOptions.binding;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
logger.debug(`Opening serial port with ${JSON.stringify(serialOpts)}`, NS);
|
|
125
|
-
this.serialPort = new SerialPort(serialOpts);
|
|
126
|
-
|
|
127
|
-
this.writer.pipe(this.serialPort);
|
|
128
|
-
|
|
129
|
-
this.serialPort.pipe(this.reader);
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
await this.serialPort.asyncOpen();
|
|
133
|
-
logger.info("Serial port opened", NS);
|
|
134
|
-
|
|
135
|
-
this.serialPort.once("close", this.onPortClose.bind(this));
|
|
136
|
-
this.serialPort.on("error", this.onPortError.bind(this));
|
|
137
|
-
} catch (error) {
|
|
138
|
-
await this.stop();
|
|
139
|
-
|
|
140
|
-
throw error;
|
|
141
|
-
}
|
|
142
|
-
} else {
|
|
143
|
-
// biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`
|
|
144
|
-
const info = SocketPortUtils.parseTcpPath(this.portOptions.path!);
|
|
145
|
-
logger.debug(`Opening TCP socket with ${info.host}:${info.port}`, NS);
|
|
146
|
-
|
|
147
|
-
this.socketPort = new Socket();
|
|
148
|
-
this.socketPort.setNoDelay(true);
|
|
149
|
-
this.socketPort.setKeepAlive(true, 15000);
|
|
150
|
-
|
|
151
|
-
this.writer.pipe(this.socketPort);
|
|
152
|
-
|
|
153
|
-
this.socketPort.pipe(this.reader);
|
|
154
|
-
|
|
155
|
-
return await new Promise((resolve, reject): void => {
|
|
156
|
-
const openError = async (err: Error): Promise<void> => {
|
|
157
|
-
await this.stop();
|
|
158
|
-
|
|
159
|
-
reject(err);
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
this.socketPort?.on("connect", () => {
|
|
163
|
-
logger.debug("Socket connected", NS);
|
|
164
|
-
});
|
|
165
|
-
this.socketPort?.on("ready", (): void => {
|
|
166
|
-
logger.info("Socket ready", NS);
|
|
167
|
-
this.socketPort?.removeListener("error", openError);
|
|
168
|
-
this.socketPort?.once("close", this.onPortClose.bind(this));
|
|
169
|
-
this.socketPort?.on("error", this.onPortError.bind(this));
|
|
170
|
-
|
|
171
|
-
resolve();
|
|
172
|
-
});
|
|
173
|
-
this.socketPort?.once("error", openError);
|
|
174
|
-
|
|
175
|
-
this.socketPort?.connect(info.port, info.host);
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
public async closePort(): Promise<void> {
|
|
181
|
-
if (this.serialPort?.isOpen) {
|
|
182
|
-
try {
|
|
183
|
-
await this.serialPort.asyncFlushAndClose();
|
|
184
|
-
} catch (err) {
|
|
185
|
-
logger.error(`Failed to close serial port ${err}.`, NS);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
this.serialPort.removeAllListeners();
|
|
189
|
-
this.serialPort = undefined;
|
|
190
|
-
} else if (this.socketPort !== undefined && !this.socketPort.closed) {
|
|
191
|
-
this.socketPort.destroy();
|
|
192
|
-
this.socketPort.removeAllListeners();
|
|
193
|
-
this.socketPort = undefined;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
private async onPortClose(err: boolean | Error): Promise<void> {
|
|
198
|
-
logger.info(`Port closed. Error? ${err ?? "no"}`, NS);
|
|
199
|
-
if (this.inReset) {
|
|
200
|
-
await wait(3000);
|
|
201
|
-
await this.openPort();
|
|
202
|
-
this.inReset = false;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
private onPortError(error: Error): void {
|
|
207
|
-
logger.info(`Port error: ${error}`, NS);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
private async onPackage(data: Buffer): Promise<void> {
|
|
211
|
-
if (this.inReset) return;
|
|
212
|
-
const len = data.readUInt16LE(0);
|
|
213
|
-
const pType = data.readUInt8(2);
|
|
214
|
-
const pFlags = data.readUInt8(3);
|
|
215
|
-
const isACK = (pFlags & 0x1) === 1;
|
|
216
|
-
const retransmit = ((pFlags >> 1) & 0x1) === 1;
|
|
217
|
-
const sequence = (pFlags >> 2) & 0x3;
|
|
218
|
-
const ACKseq = (pFlags >> 4) & 0x3;
|
|
219
|
-
const isFirst = ((pFlags >> 6) & 0x1) === 1;
|
|
220
|
-
const isLast = ((pFlags >> 7) & 0x1) === 1;
|
|
221
|
-
logger.debug(
|
|
222
|
-
() =>
|
|
223
|
-
`<-- package type ${pType}, flags ${pFlags.toString(16)}` +
|
|
224
|
-
`${JSON.stringify({isACK, retransmit, sequence, ACKseq, isFirst, isLast})}`,
|
|
225
|
-
NS,
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
if (pType !== ZBOSS_NCP_API_HL) {
|
|
229
|
-
logger.error(`<-- Wrong package type: ${pType}`, NS);
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
if (isACK) {
|
|
233
|
-
// ACKseq is received
|
|
234
|
-
this.handleACK(ACKseq);
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
if (len <= 5) {
|
|
238
|
-
logger.debug("<-- Empty package", NS);
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// header crc
|
|
243
|
-
const hCRC = data.readUInt8(4);
|
|
244
|
-
const hCRC8 = crc8(data.subarray(0, 4));
|
|
245
|
-
if (hCRC !== hCRC8) {
|
|
246
|
-
logger.error(`<-- Wrong package header crc: is ${hCRC}, expected ${hCRC8}`, NS);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// body crc
|
|
251
|
-
const bCRC = data.readUInt16LE(5);
|
|
252
|
-
const body = data.subarray(7);
|
|
253
|
-
const bodyCRC16 = crc16(body);
|
|
254
|
-
|
|
255
|
-
if (bCRC !== bodyCRC16) {
|
|
256
|
-
logger.error(`<-- Wrong package body crc: is ${bCRC}, expected ${bodyCRC16}`, NS);
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
this.recvSeq = sequence;
|
|
261
|
-
// Send ACK
|
|
262
|
-
logger.debug(`--> ACK (${this.recvSeq})`, NS);
|
|
263
|
-
await this.sendACK(this.recvSeq);
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
logger.debug(`<-- FRAME: ${body.toString("hex")}`, NS);
|
|
267
|
-
const frame = readZBOSSFrame(body);
|
|
268
|
-
if (frame) {
|
|
269
|
-
this.emit("frame", frame);
|
|
270
|
-
}
|
|
271
|
-
} catch (error) {
|
|
272
|
-
logger.debug(`<-- error ${(error as Error).stack}`, NS);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
public async sendBuffer(buf: Buffer): Promise<void> {
|
|
277
|
-
try {
|
|
278
|
-
logger.debug(`--> FRAME: ${buf.toString("hex")}`, NS);
|
|
279
|
-
let flags = (this.sendSeq & 0x03) << 2; // sequence
|
|
280
|
-
flags = flags | ZBOSS_FLAG_FIRST_FRAGMENT | ZBOSS_FLAG_LAST_FRAGMENT;
|
|
281
|
-
const pack = this.makePack(flags, buf);
|
|
282
|
-
const isACK = (flags & 0x1) === 1;
|
|
283
|
-
const retransmit = ((flags >> 1) & 0x1) === 1;
|
|
284
|
-
const sequence = (flags >> 2) & 0x3;
|
|
285
|
-
const ACKseq = (flags >> 4) & 0x3;
|
|
286
|
-
const isFirst = ((flags >> 6) & 0x1) === 1;
|
|
287
|
-
const isLast = ((flags >> 7) & 0x1) === 1;
|
|
288
|
-
logger.debug(
|
|
289
|
-
() =>
|
|
290
|
-
`--> package type ${ZBOSS_NCP_API_HL}, flags ${flags.toString(16)}` +
|
|
291
|
-
`${JSON.stringify({isACK, retransmit, sequence, ACKseq, isFirst, isLast})}`,
|
|
292
|
-
NS,
|
|
293
|
-
);
|
|
294
|
-
logger.debug(`--> PACK: ${pack.toString("hex")}`, NS);
|
|
295
|
-
await this.sendDATA(pack);
|
|
296
|
-
} catch (error) {
|
|
297
|
-
logger.debug(`--> error ${(error as Error).stack}`, NS);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
public async sendFrame(frame: ZBOSSFrame): Promise<void> {
|
|
302
|
-
return await this.sendBuffer(writeZBOSSFrame(frame));
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
private async sendDATA(data: Buffer, isACK = false): Promise<void> {
|
|
306
|
-
const seq = this.sendSeq;
|
|
307
|
-
const nextSeq = this.sendSeq;
|
|
308
|
-
const ackSeq = this.recvSeq;
|
|
309
|
-
|
|
310
|
-
return await this.queue.execute<void>(async (): Promise<void> => {
|
|
311
|
-
try {
|
|
312
|
-
logger.debug(`--> DATA (${seq},${ackSeq},0): ${data.toString("hex")}`, NS);
|
|
313
|
-
if (!isACK) {
|
|
314
|
-
const waiter = this.waitFor(nextSeq);
|
|
315
|
-
this.writeBuffer(data);
|
|
316
|
-
logger.debug(`-?- waiting (${nextSeq})`, NS);
|
|
317
|
-
if (!this.inReset) {
|
|
318
|
-
await waiter.start().promise;
|
|
319
|
-
}
|
|
320
|
-
logger.debug(`-+- waiting (${nextSeq}) success`, NS);
|
|
321
|
-
} else {
|
|
322
|
-
this.writeBuffer(data);
|
|
323
|
-
}
|
|
324
|
-
} catch (e1) {
|
|
325
|
-
logger.error(`--> Error: ${e1}`, NS);
|
|
326
|
-
logger.error(`-!- break waiting (${nextSeq})`, NS);
|
|
327
|
-
logger.error(`Can't send DATA frame (${seq},${ackSeq},0): ${data.toString("hex")}`, NS);
|
|
328
|
-
throw new Error(`sendDATA error: try 1: ${e1}`);
|
|
329
|
-
// try {
|
|
330
|
-
// await Wait(500);
|
|
331
|
-
// const waiter = this.waitFor(nextSeq);
|
|
332
|
-
// logger.debug(`->> DATA (${seq},${ackSeq},1): ${data.toString('hex')}`, NS);
|
|
333
|
-
// this.writeBuffer(data);
|
|
334
|
-
// logger.debug(`-?- rewaiting (${nextSeq})`, NS);
|
|
335
|
-
// await waiter.start().promise;
|
|
336
|
-
// logger.debug(`-+- rewaiting (${nextSeq}) success`, NS);
|
|
337
|
-
// } catch (e2) {
|
|
338
|
-
// logger.error(`--> Error: ${e2}`, NS);
|
|
339
|
-
// logger.error(`-!- break rewaiting (${nextSeq})`, NS);
|
|
340
|
-
// logger.error(`Can't resend DATA frame (${seq},${ackSeq},1): ${data.toString('hex')}`, NS);
|
|
341
|
-
// throw new Error(`sendDATA error: try 1: ${e1}, try 2: ${e2}`);
|
|
342
|
-
// }
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
private handleACK(ackSeq: number): boolean {
|
|
348
|
-
/* Handle an acknowledgement package */
|
|
349
|
-
// next number after the last accepted package
|
|
350
|
-
this.ackSeq = ackSeq & 0x03;
|
|
351
|
-
|
|
352
|
-
logger.debug(`<-- ACK (${this.ackSeq})`, NS);
|
|
353
|
-
|
|
354
|
-
const handled = this.waitress.resolve(this.ackSeq);
|
|
355
|
-
|
|
356
|
-
if (!handled && this.sendSeq !== this.ackSeq) {
|
|
357
|
-
// Packet confirmation received for {ackSeq}, but was expected {sendSeq}
|
|
358
|
-
// This happens when the chip has not yet received of the packet {sendSeq} from us,
|
|
359
|
-
// but has already sent us the next one.
|
|
360
|
-
logger.debug(`Unexpected packet sequence ${this.ackSeq} | ${this.sendSeq}`, NS);
|
|
361
|
-
} else {
|
|
362
|
-
// next
|
|
363
|
-
this.sendSeq = {0: 1, 1: 2, 2: 3, 3: 1}[this.sendSeq] || 1;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
return handled;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
private async sendACK(ackNum: number, retransmit = false): Promise<void> {
|
|
370
|
-
/* Construct a acknowledgement package */
|
|
371
|
-
|
|
372
|
-
let flags = (ackNum & 0x03) << 4; // ACKseq
|
|
373
|
-
flags |= 0x01; // isACK
|
|
374
|
-
if (retransmit) {
|
|
375
|
-
flags |= 0x02; // retransmit
|
|
376
|
-
}
|
|
377
|
-
const ackPackage = this.makePack(flags, undefined);
|
|
378
|
-
const isACK = (flags & 0x1) === 1;
|
|
379
|
-
const sequence = (flags >> 2) & 0x3;
|
|
380
|
-
const ACKseq = (flags >> 4) & 0x3;
|
|
381
|
-
const isFirst = ((flags >> 6) & 0x1) === 1;
|
|
382
|
-
const isLast = ((flags >> 7) & 0x1) === 1;
|
|
383
|
-
logger.debug(
|
|
384
|
-
() =>
|
|
385
|
-
`--> package type ${ZBOSS_NCP_API_HL}, flags ${flags.toString(16)}` +
|
|
386
|
-
`${JSON.stringify({isACK, retransmit, sequence, ACKseq, isFirst, isLast})}`,
|
|
387
|
-
NS,
|
|
388
|
-
);
|
|
389
|
-
logger.debug(`--> ACK: ${ackPackage.toString("hex")}`, NS);
|
|
390
|
-
await this.sendDATA(ackPackage, true);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
private writeBuffer(buffer: Buffer): void {
|
|
394
|
-
logger.debug(`--> [${buffer.toString("hex")}]`, NS);
|
|
395
|
-
this.writer.push(buffer);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
private makePack(flags: number, data?: Buffer): Buffer {
|
|
399
|
-
/* Construct a package */
|
|
400
|
-
const packLen = 5 + (data ? data.length + 2 : 0);
|
|
401
|
-
const header = Buffer.alloc(7);
|
|
402
|
-
header.writeUInt16BE(SIGNATURE);
|
|
403
|
-
header.writeUInt16LE(packLen, 2);
|
|
404
|
-
header.writeUInt8(ZBOSS_NCP_API_HL, 4);
|
|
405
|
-
header.writeUInt8(flags, 5);
|
|
406
|
-
const hCRC8 = crc8(header.subarray(2, 6));
|
|
407
|
-
header.writeUInt8(hCRC8, 6);
|
|
408
|
-
if (data) {
|
|
409
|
-
const pCRC16 = Buffer.alloc(2);
|
|
410
|
-
pCRC16.writeUInt16LE(crc16(data));
|
|
411
|
-
return Buffer.concat([header, pCRC16, data]);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
return header;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
private waitFor(sequence: number, timeout = 2000): {start: () => {promise: Promise<number>; ID: number}; ID: number} {
|
|
418
|
-
return this.waitress.waitFor(sequence, timeout);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
private waitressTimeoutFormatter(matcher: number, timeout: number): string {
|
|
422
|
-
return `${matcher} after ${timeout}ms`;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
private waitressValidator(sequence: number, matcher: number): boolean {
|
|
426
|
-
return sequence === matcher;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/* v8 ignore start */
|
|
2
|
-
|
|
3
|
-
const crc16Table = [
|
|
4
|
-
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108,
|
|
5
|
-
0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399,
|
|
6
|
-
0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e,
|
|
7
|
-
0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
|
|
8
|
-
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44,
|
|
9
|
-
0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5,
|
|
10
|
-
0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862,
|
|
11
|
-
0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
|
|
12
|
-
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483,
|
|
13
|
-
0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710,
|
|
14
|
-
0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1,
|
|
15
|
-
0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
|
|
16
|
-
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf,
|
|
17
|
-
0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c,
|
|
18
|
-
0x3de3, 0x2c6a, 0x1ef1, 0x0f78,
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 residue=0x0000 name="CRC-16/KERMIT"
|
|
23
|
-
*/
|
|
24
|
-
export function crc16(data: Buffer): number {
|
|
25
|
-
let crc = 0x0000;
|
|
26
|
-
|
|
27
|
-
for (const byte of data) {
|
|
28
|
-
crc = crc16Table[(crc ^ byte) & 0xff] ^ ((crc >> 8) & 0xff);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return crc ^ (0x0 & 0xffff);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const crc8Table = [
|
|
35
|
-
0xea, 0xd4, 0x96, 0xa8, 0x12, 0x2c, 0x6e, 0x50, 0x7f, 0x41, 0x03, 0x3d, 0x87, 0xb9, 0xfb, 0xc5, 0xa5, 0x9b, 0xd9, 0xe7, 0x5d, 0x63, 0x21, 0x1f,
|
|
36
|
-
0x30, 0x0e, 0x4c, 0x72, 0xc8, 0xf6, 0xb4, 0x8a, 0x74, 0x4a, 0x08, 0x36, 0x8c, 0xb2, 0xf0, 0xce, 0xe1, 0xdf, 0x9d, 0xa3, 0x19, 0x27, 0x65, 0x5b,
|
|
37
|
-
0x3b, 0x05, 0x47, 0x79, 0xc3, 0xfd, 0xbf, 0x81, 0xae, 0x90, 0xd2, 0xec, 0x56, 0x68, 0x2a, 0x14, 0xb3, 0x8d, 0xcf, 0xf1, 0x4b, 0x75, 0x37, 0x09,
|
|
38
|
-
0x26, 0x18, 0x5a, 0x64, 0xde, 0xe0, 0xa2, 0x9c, 0xfc, 0xc2, 0x80, 0xbe, 0x04, 0x3a, 0x78, 0x46, 0x69, 0x57, 0x15, 0x2b, 0x91, 0xaf, 0xed, 0xd3,
|
|
39
|
-
0x2d, 0x13, 0x51, 0x6f, 0xd5, 0xeb, 0xa9, 0x97, 0xb8, 0x86, 0xc4, 0xfa, 0x40, 0x7e, 0x3c, 0x02, 0x62, 0x5c, 0x1e, 0x20, 0x9a, 0xa4, 0xe6, 0xd8,
|
|
40
|
-
0xf7, 0xc9, 0x8b, 0xb5, 0x0f, 0x31, 0x73, 0x4d, 0x58, 0x66, 0x24, 0x1a, 0xa0, 0x9e, 0xdc, 0xe2, 0xcd, 0xf3, 0xb1, 0x8f, 0x35, 0x0b, 0x49, 0x77,
|
|
41
|
-
0x17, 0x29, 0x6b, 0x55, 0xef, 0xd1, 0x93, 0xad, 0x82, 0xbc, 0xfe, 0xc0, 0x7a, 0x44, 0x06, 0x38, 0xc6, 0xf8, 0xba, 0x84, 0x3e, 0x00, 0x42, 0x7c,
|
|
42
|
-
0x53, 0x6d, 0x2f, 0x11, 0xab, 0x95, 0xd7, 0xe9, 0x89, 0xb7, 0xf5, 0xcb, 0x71, 0x4f, 0x0d, 0x33, 0x1c, 0x22, 0x60, 0x5e, 0xe4, 0xda, 0x98, 0xa6,
|
|
43
|
-
0x01, 0x3f, 0x7d, 0x43, 0xf9, 0xc7, 0x85, 0xbb, 0x94, 0xaa, 0xe8, 0xd6, 0x6c, 0x52, 0x10, 0x2e, 0x4e, 0x70, 0x32, 0x0c, 0xb6, 0x88, 0xca, 0xf4,
|
|
44
|
-
0xdb, 0xe5, 0xa7, 0x99, 0x23, 0x1d, 0x5f, 0x61, 0x9f, 0xa1, 0xe3, 0xdd, 0x67, 0x59, 0x1b, 0x25, 0x0a, 0x34, 0x76, 0x48, 0xf2, 0xcc, 0x8e, 0xb0,
|
|
45
|
-
0xd0, 0xee, 0xac, 0x92, 0x28, 0x16, 0x54, 0x6a, 0x45, 0x7b, 0x39, 0x07, 0xbd, 0x83, 0xc1, 0xff,
|
|
46
|
-
];
|
|
47
|
-
/**
|
|
48
|
-
* width=8 poly=0x4d init=0xff refin=true refout=true xorout=0xff check=0xd8 name="CRC-8/KOOP"
|
|
49
|
-
*/
|
|
50
|
-
export function crc8(data: Buffer): number {
|
|
51
|
-
let crc = 0x00;
|
|
52
|
-
|
|
53
|
-
for (const byte of data) {
|
|
54
|
-
crc = crc8Table[(crc ^ byte) & 0xff];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return crc;
|
|
58
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/* v8 ignore start */
|
|
2
|
-
|
|
3
|
-
import {Readable, type ReadableOptions} from "node:stream";
|
|
4
|
-
|
|
5
|
-
export class ZBOSSWriter extends Readable {
|
|
6
|
-
private bytesToWrite: number[];
|
|
7
|
-
|
|
8
|
-
constructor(opts?: ReadableOptions) {
|
|
9
|
-
super(opts);
|
|
10
|
-
|
|
11
|
-
this.bytesToWrite = [];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
private writeBytes(): void {
|
|
15
|
-
const buffer = Buffer.from(this.bytesToWrite);
|
|
16
|
-
this.bytesToWrite = [];
|
|
17
|
-
|
|
18
|
-
// expensive and very verbose, enable locally only if necessary
|
|
19
|
-
// logger.debug(`>>>> [FRAME raw=${buffer.toString('hex')}]`, NS);
|
|
20
|
-
|
|
21
|
-
// this.push(buffer);
|
|
22
|
-
this.emit("data", buffer);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public writeByte(byte: number): void {
|
|
26
|
-
this.bytesToWrite.push(byte);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public writeAvailable(): boolean {
|
|
30
|
-
if (this.readableLength < this.readableHighWaterMark) {
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
this.writeFlush();
|
|
35
|
-
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* If there is anything to send, send to the port.
|
|
41
|
-
*/
|
|
42
|
-
public writeFlush(): void {
|
|
43
|
-
if (this.bytesToWrite.length) {
|
|
44
|
-
this.writeBytes();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public override _read(): void {}
|
|
49
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import {BuffaloZdo} from "../../../zspec/zdo/buffaloZdo";
|
|
2
|
-
|
|
3
|
-
class ZiGateZdoBuffalo extends BuffaloZdo {
|
|
4
|
-
public override writeUInt16(value: number): void {
|
|
5
|
-
this.buffer.writeUInt16BE(value, this.position);
|
|
6
|
-
this.position += 2;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
public override writeUInt32(value: number): void {
|
|
10
|
-
this.buffer.writeUInt32BE(value, this.position);
|
|
11
|
-
this.position += 4;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public override writeIeeeAddr(value: string /*TODO: EUI64*/): void {
|
|
15
|
-
this.writeUInt32(Number.parseInt(value.slice(2, 10), 16));
|
|
16
|
-
this.writeUInt32(Number.parseInt(value.slice(10), 16));
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Patch BuffaloZdo to use Big Endian variants.
|
|
22
|
-
*/
|
|
23
|
-
export const patchZdoBuffaloBE = (): void => {
|
|
24
|
-
BuffaloZdo.prototype.writeUInt16 = ZiGateZdoBuffalo.prototype.writeUInt16;
|
|
25
|
-
BuffaloZdo.prototype.writeUInt32 = ZiGateZdoBuffalo.prototype.writeUInt32;
|
|
26
|
-
BuffaloZdo.prototype.writeIeeeAddr = ZiGateZdoBuffalo.prototype.writeIeeeAddr;
|
|
27
|
-
};
|