@zimo-elektronik/zcan 1.0.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/.dockerignore +7 -0
- package/.editorconfig +15 -0
- package/.eslintignore +7 -0
- package/.eslintrc.cjs +17 -0
- package/.gitattributes +1 -0
- package/.github/workflows/docs.yml +46 -0
- package/.github/workflows/library.yml +59 -0
- package/.nvmrc +1 -0
- package/.prettierignore +14 -0
- package/.prettierrc.json +8 -0
- package/LICENSE.md +21 -0
- package/README.md +8 -0
- package/__tests__/connection.test.ts +58 -0
- package/__tests__/dataGroup.test.ts +98 -0
- package/__tests__/infoGroup.test.ts +30 -0
- package/__tests__/lanDataGroup.test.ts +82 -0
- package/__tests__/lanInfoGroup.test.ts +41 -0
- package/__tests__/systemControlGroup.test.ts +42 -0
- package/__tests__/trackCfgGroup.test.ts +43 -0
- package/__tests__/util/index.ts +14 -0
- package/__tests__/vehicleGroup.test.ts +128 -0
- package/dist/@types/communication.d.ts +30 -0
- package/dist/@types/communication.js +2 -0
- package/dist/@types/communication.js.map +1 -0
- package/dist/@types/models.d.ts +172 -0
- package/dist/@types/models.js +2 -0
- package/dist/@types/models.js.map +1 -0
- package/dist/MX10.d.ts +45 -0
- package/dist/MX10.js +233 -0
- package/dist/MX10.js.map +1 -0
- package/dist/docs_entrypoint.d.ts +6 -0
- package/dist/docs_entrypoint.js +7 -0
- package/dist/docs_entrypoint.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/bites.d.ts +9 -0
- package/dist/internal/bites.js +10 -0
- package/dist/internal/bites.js.map +1 -0
- package/dist/internal/speedUtils.d.ts +9 -0
- package/dist/internal/speedUtils.js +29 -0
- package/dist/internal/speedUtils.js.map +1 -0
- package/dist/internal/utils.d.ts +1 -0
- package/dist/internal/utils.js +4 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/util/enums.d.ts +113 -0
- package/dist/util/enums.js +137 -0
- package/dist/util/enums.js.map +1 -0
- package/dist/util/extended-ascii.d.ts +7 -0
- package/dist/util/extended-ascii.js +162 -0
- package/dist/util/extended-ascii.js.map +1 -0
- package/dist/zcan/accessoryCommandGroup.d.ts +6 -0
- package/dist/zcan/accessoryCommandGroup.js +9 -0
- package/dist/zcan/accessoryCommandGroup.js.map +1 -0
- package/dist/zcan/dataGroup.d.ts +31 -0
- package/dist/zcan/dataGroup.js +233 -0
- package/dist/zcan/dataGroup.js.map +1 -0
- package/dist/zcan/fileControlGroup.d.ts +7 -0
- package/dist/zcan/fileControlGroup.js +9 -0
- package/dist/zcan/fileControlGroup.js.map +1 -0
- package/dist/zcan/fileTransferGroup.d.ts +7 -0
- package/dist/zcan/fileTransferGroup.js +9 -0
- package/dist/zcan/fileTransferGroup.js.map +1 -0
- package/dist/zcan/index.d.ts +18 -0
- package/dist/zcan/index.js +19 -0
- package/dist/zcan/index.js.map +1 -0
- package/dist/zcan/infoGroup.d.ts +15 -0
- package/dist/zcan/infoGroup.js +64 -0
- package/dist/zcan/infoGroup.js.map +1 -0
- package/dist/zcan/lanDataGroup.d.ts +23 -0
- package/dist/zcan/lanDataGroup.js +226 -0
- package/dist/zcan/lanDataGroup.js.map +1 -0
- package/dist/zcan/lanInfoGroup.d.ts +11 -0
- package/dist/zcan/lanInfoGroup.js +58 -0
- package/dist/zcan/lanInfoGroup.js.map +1 -0
- package/dist/zcan/lanNetworkGroup.d.ts +11 -0
- package/dist/zcan/lanNetworkGroup.js +37 -0
- package/dist/zcan/lanNetworkGroup.js.map +1 -0
- package/dist/zcan/lanZimoProgrammableScriptGroup.d.ts +7 -0
- package/dist/zcan/lanZimoProgrammableScriptGroup.js +9 -0
- package/dist/zcan/lanZimoProgrammableScriptGroup.js.map +1 -0
- package/dist/zcan/networkGroup.d.ts +10 -0
- package/dist/zcan/networkGroup.js +38 -0
- package/dist/zcan/networkGroup.js.map +1 -0
- package/dist/zcan/propertyConfigGroup.d.ts +7 -0
- package/dist/zcan/propertyConfigGroup.js +9 -0
- package/dist/zcan/propertyConfigGroup.js.map +1 -0
- package/dist/zcan/railwayControlGroup.d.ts +7 -0
- package/dist/zcan/railwayControlGroup.js +9 -0
- package/dist/zcan/railwayControlGroup.js.map +1 -0
- package/dist/zcan/systemControlGroup.d.ts +13 -0
- package/dist/zcan/systemControlGroup.js +35 -0
- package/dist/zcan/systemControlGroup.js.map +1 -0
- package/dist/zcan/trackCfgGroup.d.ts +16 -0
- package/dist/zcan/trackCfgGroup.js +77 -0
- package/dist/zcan/trackCfgGroup.js.map +1 -0
- package/dist/zcan/trainControlGroup.d.ts +8 -0
- package/dist/zcan/trainControlGroup.js +19 -0
- package/dist/zcan/trainControlGroup.js.map +1 -0
- package/dist/zcan/vehicleGroup.d.ts +26 -0
- package/dist/zcan/vehicleGroup.js +145 -0
- package/dist/zcan/vehicleGroup.js.map +1 -0
- package/dist/zcan/zimoProgrammableScriptGroup.d.ts +7 -0
- package/dist/zcan/zimoProgrammableScriptGroup.js +9 -0
- package/dist/zcan/zimoProgrammableScriptGroup.js.map +1 -0
- package/gulpfile.js +37 -0
- package/jest.config.js +26 -0
- package/package.json +50 -0
- package/protocol_docs/README.md +41 -0
- package/protocol_docs/babel.config.js +3 -0
- package/protocol_docs/docs/command-groups/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/accessories/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/accessories/accessory-state.md +7 -0
- package/protocol_docs/docs/command-groups/command-groups.md +50 -0
- package/protocol_docs/docs/command-groups/data/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/data/data-name-extended.md +60 -0
- package/protocol_docs/docs/command-groups/data/group-count.md +52 -0
- package/protocol_docs/docs/command-groups/data/item-fx-info.md +27 -0
- package/protocol_docs/docs/command-groups/data/item-image-config.md +44 -0
- package/protocol_docs/docs/command-groups/data/item-list-by-index.md +45 -0
- package/protocol_docs/docs/command-groups/data/item-list-by-nid.md +43 -0
- package/protocol_docs/docs/command-groups/data/remove-train.md +33 -0
- package/protocol_docs/docs/command-groups/info/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/info/bidi-info.md +34 -0
- package/protocol_docs/docs/command-groups/lan-data/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/lan-data/data-value-extended.md +65 -0
- package/protocol_docs/docs/command-groups/lan-data/loco-gui-extended.md +48 -0
- package/protocol_docs/docs/command-groups/lan-info/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/lan-info/module-power-info.md +26 -0
- package/protocol_docs/docs/command-groups/lan-network/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/lan-network/open-port.md +47 -0
- package/protocol_docs/docs/command-groups/network/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/network/ping.md +49 -0
- package/protocol_docs/docs/command-groups/system/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/system/system-state.md +59 -0
- package/protocol_docs/docs/command-groups/track/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/track/tse-prog-read.md +37 -0
- package/protocol_docs/docs/command-groups/track/tse-prog-write.md +35 -0
- package/protocol_docs/docs/command-groups/train/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/train/train-part-find.md +33 -0
- package/protocol_docs/docs/command-groups/vehicles/_category_.json +4 -0
- package/protocol_docs/docs/command-groups/vehicles/vehicle-function.md +36 -0
- package/protocol_docs/docs/command-groups/vehicles/vehicle-mode.md +143 -0
- package/protocol_docs/docs/command-groups/vehicles/vehicle-special-function-switch.md +35 -0
- package/protocol_docs/docs/command-groups/vehicles/vehicle-speed.md +55 -0
- package/protocol_docs/docs/description.md +4 -0
- package/protocol_docs/docs/introduction/_category_.json +4 -0
- package/protocol_docs/docs/introduction/how-it-works.md +61 -0
- package/protocol_docs/docs/introduction/implementation.md +39 -0
- package/protocol_docs/docs/introduction/interface.md +62 -0
- package/protocol_docs/docs/introduction/introduction.md +82 -0
- package/protocol_docs/docusaurus.config.js +111 -0
- package/protocol_docs/package-lock.json +25611 -0
- package/protocol_docs/package.json +47 -0
- package/protocol_docs/sidebars.js +22 -0
- package/protocol_docs/src/components/CommandAndGroup/index.tsx +16 -0
- package/protocol_docs/src/components/CommandAndGroup/styles.module.css +12 -0
- package/protocol_docs/src/components/HomepageFeatures/index.tsx +70 -0
- package/protocol_docs/src/components/HomepageFeatures/styles.module.css +11 -0
- package/protocol_docs/src/css/custom.css +76 -0
- package/protocol_docs/src/pages/index.module.css +23 -0
- package/protocol_docs/src/pages/index.tsx +41 -0
- package/protocol_docs/src/pages/markdown-page.md +7 -0
- package/protocol_docs/static/.nojekyll +0 -0
- package/protocol_docs/static/img/docusaurus.png +0 -0
- package/protocol_docs/static/img/favicon.ico +0 -0
- package/protocol_docs/static/img/undraw_docusaurus_mountain.svg +171 -0
- package/protocol_docs/static/img/undraw_docusaurus_react.svg +170 -0
- package/protocol_docs/static/img/undraw_docusaurus_tree.svg +40 -0
- package/protocol_docs/static/typedoc/index.html +10 -0
- package/protocol_docs/tsconfig.json +7 -0
- package/src/@types/communication.ts +73 -0
- package/src/@types/models.ts +215 -0
- package/src/MX10.ts +351 -0
- package/src/docs_entrypoint.ts +34 -0
- package/src/index.ts +8 -0
- package/src/internal/bites.ts +11 -0
- package/src/internal/speedUtils.ts +36 -0
- package/src/internal/utils.ts +3 -0
- package/src/util/enums.ts +147 -0
- package/src/util/extended-ascii.ts +179 -0
- package/src/zcan/accessoryCommandGroup.ts +24 -0
- package/src/zcan/dataGroup.ts +342 -0
- package/src/zcan/fileControlGroup.ts +25 -0
- package/src/zcan/fileTransferGroup.ts +25 -0
- package/src/zcan/index.ts +37 -0
- package/src/zcan/infoGroup.ts +90 -0
- package/src/zcan/lanDataGroup.ts +361 -0
- package/src/zcan/lanInfoGroup.ts +86 -0
- package/src/zcan/lanNetworkGroup.ts +70 -0
- package/src/zcan/lanZimoProgrammableScriptGroup.ts +25 -0
- package/src/zcan/networkGroup.ts +71 -0
- package/src/zcan/propertyConfigGroup.ts +25 -0
- package/src/zcan/railwayControlGroup.ts +25 -0
- package/src/zcan/systemControlGroup.ts +62 -0
- package/src/zcan/trackCfgGroup.ts +109 -0
- package/src/zcan/trainControlGroup.ts +48 -0
- package/src/zcan/vehicleGroup.ts +267 -0
- package/src/zcan/zimoProgrammableScriptGroup.ts +25 -0
- package/tsconfig.build.json +12 -0
- package/tsconfig.json +49 -0
- package/tsconfig.test.json +9 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (Nonstandard) String utility function for 8-bit ASCII with the extended
|
|
3
|
+
* character set. Unlike the ASCII above, we do not mask the high bits.
|
|
4
|
+
*
|
|
5
|
+
* Placed into a separate file so it can be used with other Buffer implementations.
|
|
6
|
+
* @see http://en.wikipedia.org/wiki/Extended_ASCII
|
|
7
|
+
*/
|
|
8
|
+
import {Buffer} from 'buffer';
|
|
9
|
+
|
|
10
|
+
export default class ExtendedASCII {
|
|
11
|
+
private static extendedChars = [
|
|
12
|
+
'\u00C7',
|
|
13
|
+
'\u00FC',
|
|
14
|
+
'\u00E9',
|
|
15
|
+
'\u00E2',
|
|
16
|
+
'\u00E4',
|
|
17
|
+
'\u00E0',
|
|
18
|
+
'\u00E5',
|
|
19
|
+
'\u00E7',
|
|
20
|
+
'\u00EA',
|
|
21
|
+
'\u00EB',
|
|
22
|
+
'\u00E8',
|
|
23
|
+
'\u00EF',
|
|
24
|
+
'\u00EE',
|
|
25
|
+
'\u00EC',
|
|
26
|
+
'\u00C4',
|
|
27
|
+
'\u00C5',
|
|
28
|
+
'\u00C9',
|
|
29
|
+
'\u00E6',
|
|
30
|
+
'\u00C6',
|
|
31
|
+
'\u00F4',
|
|
32
|
+
'\u00F6',
|
|
33
|
+
'\u00F2',
|
|
34
|
+
'\u00FB',
|
|
35
|
+
'\u00F9',
|
|
36
|
+
'\u00FF',
|
|
37
|
+
'\u00D6',
|
|
38
|
+
'\u00DC',
|
|
39
|
+
'\u00F8',
|
|
40
|
+
'\u00A3',
|
|
41
|
+
'\u00D8',
|
|
42
|
+
'\u00D7',
|
|
43
|
+
'\u0192',
|
|
44
|
+
'\u00E1',
|
|
45
|
+
'\u00ED',
|
|
46
|
+
'\u00F3',
|
|
47
|
+
'\u00FA',
|
|
48
|
+
'\u00F1',
|
|
49
|
+
'\u00D1',
|
|
50
|
+
'\u00AA',
|
|
51
|
+
'\u00BA',
|
|
52
|
+
'\u00BF',
|
|
53
|
+
'\u00AE',
|
|
54
|
+
'\u00AC',
|
|
55
|
+
'\u00BD',
|
|
56
|
+
'\u00BC',
|
|
57
|
+
'\u00A1',
|
|
58
|
+
'\u00AB',
|
|
59
|
+
'\u00BB',
|
|
60
|
+
'_',
|
|
61
|
+
'_',
|
|
62
|
+
'_',
|
|
63
|
+
'\u00A6',
|
|
64
|
+
'\u00A6',
|
|
65
|
+
'\u00C1',
|
|
66
|
+
'\u00C2',
|
|
67
|
+
'\u00C0',
|
|
68
|
+
'\u00A9',
|
|
69
|
+
'\u00A6',
|
|
70
|
+
'\u00A6',
|
|
71
|
+
'+',
|
|
72
|
+
'+',
|
|
73
|
+
'\u00A2',
|
|
74
|
+
'\u00A5',
|
|
75
|
+
'+',
|
|
76
|
+
'+',
|
|
77
|
+
'-',
|
|
78
|
+
'-',
|
|
79
|
+
'+',
|
|
80
|
+
'-',
|
|
81
|
+
'+',
|
|
82
|
+
'\u00E3',
|
|
83
|
+
'\u00C3',
|
|
84
|
+
'+',
|
|
85
|
+
'+',
|
|
86
|
+
'-',
|
|
87
|
+
'-',
|
|
88
|
+
'\u00A6',
|
|
89
|
+
'-',
|
|
90
|
+
'+',
|
|
91
|
+
'\u00A4',
|
|
92
|
+
'\u00F0',
|
|
93
|
+
'\u00D0',
|
|
94
|
+
'\u00CA',
|
|
95
|
+
'\u00CB',
|
|
96
|
+
'\u00C8',
|
|
97
|
+
'i',
|
|
98
|
+
'\u00CD',
|
|
99
|
+
'\u00CE',
|
|
100
|
+
'\u00CF',
|
|
101
|
+
'+',
|
|
102
|
+
'+',
|
|
103
|
+
'_',
|
|
104
|
+
'_',
|
|
105
|
+
'\u00A6',
|
|
106
|
+
'\u00CC',
|
|
107
|
+
'_',
|
|
108
|
+
'\u00D3',
|
|
109
|
+
'\u00DF',
|
|
110
|
+
'\u00D4',
|
|
111
|
+
'\u00D2',
|
|
112
|
+
'\u00F5',
|
|
113
|
+
'\u00D5',
|
|
114
|
+
'\u00B5',
|
|
115
|
+
'\u00FE',
|
|
116
|
+
'\u00DE',
|
|
117
|
+
'\u00DA',
|
|
118
|
+
'\u00DB',
|
|
119
|
+
'\u00D9',
|
|
120
|
+
'\u00FD',
|
|
121
|
+
'\u00DD',
|
|
122
|
+
'\u00AF',
|
|
123
|
+
'\u00B4',
|
|
124
|
+
'\u00AD',
|
|
125
|
+
'\u00B1',
|
|
126
|
+
'_',
|
|
127
|
+
'\u00BE',
|
|
128
|
+
'\u00B6',
|
|
129
|
+
'\u00A7',
|
|
130
|
+
'\u00F7',
|
|
131
|
+
'\u00B8',
|
|
132
|
+
'\u00B0',
|
|
133
|
+
'\u00A8',
|
|
134
|
+
'\u00B7',
|
|
135
|
+
'\u00B9',
|
|
136
|
+
'\u00B3',
|
|
137
|
+
'\u00B2',
|
|
138
|
+
'_',
|
|
139
|
+
' ',
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
public static str2byte(
|
|
143
|
+
str: string,
|
|
144
|
+
buf: Buffer,
|
|
145
|
+
offset = 0,
|
|
146
|
+
length = str.length,
|
|
147
|
+
): number {
|
|
148
|
+
for (let i = 0; i < length; i++) {
|
|
149
|
+
let charCode = str.charCodeAt(i);
|
|
150
|
+
if (charCode > 0x7f) {
|
|
151
|
+
// Check if extended ASCII.
|
|
152
|
+
const charIdx = ExtendedASCII.extendedChars.indexOf(str.charAt(i));
|
|
153
|
+
if (charIdx > -1) {
|
|
154
|
+
charCode = charIdx + 0x80;
|
|
155
|
+
}
|
|
156
|
+
// Otherwise, keep it as-is.
|
|
157
|
+
}
|
|
158
|
+
buf.writeUInt8(charCode, offset + i);
|
|
159
|
+
}
|
|
160
|
+
return length;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public static byte2str(buff: Buffer): string {
|
|
164
|
+
const chars = new Array(buff.length);
|
|
165
|
+
for (let i = 0; i < buff.length; i++) {
|
|
166
|
+
const charCode = buff[i];
|
|
167
|
+
if (charCode > 0x7f) {
|
|
168
|
+
chars[i] = ExtendedASCII.extendedChars[charCode - 128];
|
|
169
|
+
} else {
|
|
170
|
+
chars[i] = String.fromCharCode(charCode);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return chars.filter((o) => o.charCodeAt(0)).join('');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public static byteLength(str: string): number {
|
|
177
|
+
return str.length;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import MX10 from '../MX10';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @category Groups
|
|
7
|
+
*/
|
|
8
|
+
export default class AccessoryCommandGroup {
|
|
9
|
+
private mx10: MX10;
|
|
10
|
+
|
|
11
|
+
constructor(mx10: MX10) {
|
|
12
|
+
this.mx10 = mx10;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
parse(
|
|
16
|
+
size: number,
|
|
17
|
+
command: number,
|
|
18
|
+
mode: number,
|
|
19
|
+
nid: number,
|
|
20
|
+
buffer: Buffer,
|
|
21
|
+
) {
|
|
22
|
+
// console.log('parse accessory command group');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
// 0x07
|
|
2
|
+
import MX10 from '../MX10';
|
|
3
|
+
import {Buffer} from 'buffer';
|
|
4
|
+
import {Subject} from 'rxjs';
|
|
5
|
+
import {
|
|
6
|
+
RemoveLocomotiveData,
|
|
7
|
+
DataNameExtended,
|
|
8
|
+
DataNameValue1,
|
|
9
|
+
GroupCountData,
|
|
10
|
+
ItemFxInfo,
|
|
11
|
+
ItemImageData,
|
|
12
|
+
ItemListByIndexData,
|
|
13
|
+
ItemListByNidData,
|
|
14
|
+
} from '../@types/models';
|
|
15
|
+
import {FxInfoType, ImageType, NameType} from '../util/enums';
|
|
16
|
+
import ExtendedASCII from '../util/extended-ascii';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* @category Groups
|
|
21
|
+
*/
|
|
22
|
+
export default class DataGroup {
|
|
23
|
+
public readonly onGroupCount = new Subject<GroupCountData>();
|
|
24
|
+
public readonly onListItemsByIndex = new Subject<ItemListByIndexData>();
|
|
25
|
+
public readonly onListItemsByNID = new Subject<ItemListByNidData>();
|
|
26
|
+
public readonly onRemoveLocomotive = new Subject<RemoveLocomotiveData>();
|
|
27
|
+
public readonly onItemImageConfig = new Subject<ItemImageData>();
|
|
28
|
+
public readonly onItemFxInfo = new Subject<ItemFxInfo>();
|
|
29
|
+
public readonly onDataNameExtended = new Subject<DataNameExtended>();
|
|
30
|
+
|
|
31
|
+
private mx10: MX10;
|
|
32
|
+
|
|
33
|
+
constructor(mx10: MX10) {
|
|
34
|
+
this.mx10 = mx10;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
groupCount(objType = 0x0000) {
|
|
38
|
+
this.mx10.sendData(
|
|
39
|
+
0x07,
|
|
40
|
+
0x00,
|
|
41
|
+
[
|
|
42
|
+
{value: this.mx10.mx10NID, length: 2},
|
|
43
|
+
{value: objType, length: 2},
|
|
44
|
+
],
|
|
45
|
+
0b00,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
listItemsByIndex(groupNID: number, index: number) {
|
|
50
|
+
this.mx10.sendData(
|
|
51
|
+
0x07,
|
|
52
|
+
0x01,
|
|
53
|
+
[
|
|
54
|
+
{value: this.mx10.mx10NID, length: 2},
|
|
55
|
+
{value: groupNID, length: 2},
|
|
56
|
+
{value: index, length: 2},
|
|
57
|
+
],
|
|
58
|
+
0b00,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
listItemsByNID(searchAfterValue: number) {
|
|
63
|
+
this.mx10.sendData(
|
|
64
|
+
0x07,
|
|
65
|
+
0x02,
|
|
66
|
+
[
|
|
67
|
+
{value: this.mx10.mx10NID, length: 2},
|
|
68
|
+
{value: searchAfterValue, length: 2},
|
|
69
|
+
],
|
|
70
|
+
0b00,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
removeLocomotive(toRemove: number, removeFrom = this.mx10.mx10NID) {
|
|
75
|
+
this.mx10.sendData(0x07, 0x1f, [
|
|
76
|
+
{value: removeFrom, length: 2},
|
|
77
|
+
{value: toRemove, length: 2},
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
itemImageConfig(nid: number, type: ImageType, imageId: number) {
|
|
82
|
+
this.mx10.sendData(0x07, 0x12, [
|
|
83
|
+
{value: nid, length: 2},
|
|
84
|
+
{value: type, length: 2},
|
|
85
|
+
{value: imageId, length: 2},
|
|
86
|
+
]);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
itemFxInfo(nid: number, fx: number, type: FxInfoType, data: number) {
|
|
90
|
+
this.mx10.sendData(0x07, 0x15, [
|
|
91
|
+
{value: nid, length: 2},
|
|
92
|
+
{value: fx, length: 2},
|
|
93
|
+
{value: 0, length: 1},
|
|
94
|
+
{value: type, length: 1},
|
|
95
|
+
{value: data, length: 2},
|
|
96
|
+
]);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
dataNameExtended(NID: number, subID: number, name: string) {
|
|
100
|
+
this.mx10.sendData(
|
|
101
|
+
0x07,
|
|
102
|
+
0x21,
|
|
103
|
+
[
|
|
104
|
+
{value: NID, length: 2},
|
|
105
|
+
{value: subID, length: 2},
|
|
106
|
+
{value: 0, length: 4},
|
|
107
|
+
{value: 0, length: 4},
|
|
108
|
+
{value: name, length: name.length},
|
|
109
|
+
{value: 0, length: 1},
|
|
110
|
+
],
|
|
111
|
+
0b01,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
parse(
|
|
116
|
+
size: number,
|
|
117
|
+
command: number,
|
|
118
|
+
mode: number,
|
|
119
|
+
nid: number,
|
|
120
|
+
buffer: Buffer,
|
|
121
|
+
) {
|
|
122
|
+
switch (command) {
|
|
123
|
+
case 0x00:
|
|
124
|
+
this.parseGroupCount(size, mode, nid, buffer);
|
|
125
|
+
break;
|
|
126
|
+
case 0x01:
|
|
127
|
+
this.parseItemListByIndex(size, mode, nid, buffer);
|
|
128
|
+
break;
|
|
129
|
+
case 0x02:
|
|
130
|
+
this.parseItemListByNid(size, mode, nid, buffer);
|
|
131
|
+
break;
|
|
132
|
+
case 0x12:
|
|
133
|
+
this.parseItemImageConfig(size, mode, nid, buffer);
|
|
134
|
+
break;
|
|
135
|
+
case 0x15:
|
|
136
|
+
this.parseItemFxInfo(size, mode, nid, buffer);
|
|
137
|
+
break;
|
|
138
|
+
case 0x1f:
|
|
139
|
+
this.parseDataClear(size, mode, nid, buffer);
|
|
140
|
+
break;
|
|
141
|
+
case 0x21:
|
|
142
|
+
this.parseDataNameExtended(size, mode, nid, buffer);
|
|
143
|
+
break;
|
|
144
|
+
default:
|
|
145
|
+
// eslint-disable-next-line no-console
|
|
146
|
+
console.warn('command not parsed: ' + command.toString());
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// 0x07.0x00
|
|
151
|
+
private parseGroupCount(
|
|
152
|
+
size: number,
|
|
153
|
+
mode: number,
|
|
154
|
+
nid: number,
|
|
155
|
+
buffer: Buffer,
|
|
156
|
+
) {
|
|
157
|
+
if (this.onGroupCount.observed) {
|
|
158
|
+
const objectType = buffer.readUInt16LE(0);
|
|
159
|
+
const number = buffer.readUInt16LE(2);
|
|
160
|
+
|
|
161
|
+
this.onGroupCount.next({
|
|
162
|
+
objectType,
|
|
163
|
+
number,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 0x07.0x01
|
|
169
|
+
private parseItemListByIndex(
|
|
170
|
+
size: number,
|
|
171
|
+
mode: number,
|
|
172
|
+
nid: number,
|
|
173
|
+
buffer: Buffer,
|
|
174
|
+
) {
|
|
175
|
+
if (this.onListItemsByIndex.observed) {
|
|
176
|
+
const index = buffer.readUInt16LE(0);
|
|
177
|
+
const deviceNID = buffer.readUInt16LE(2);
|
|
178
|
+
const msSinceLastCommunication = buffer.readUInt16LE(4);
|
|
179
|
+
if (deviceNID) {
|
|
180
|
+
this.onListItemsByIndex.next({
|
|
181
|
+
index,
|
|
182
|
+
nid: deviceNID,
|
|
183
|
+
msSinceLastCommunication,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// 0x07.0x02
|
|
190
|
+
private parseItemListByNid(
|
|
191
|
+
size: number,
|
|
192
|
+
mode: number,
|
|
193
|
+
nid: number,
|
|
194
|
+
buffer: Buffer,
|
|
195
|
+
) {
|
|
196
|
+
if (this.onListItemsByNID.observed) {
|
|
197
|
+
const NID = buffer.readUInt16LE(0);
|
|
198
|
+
const index = buffer.readUInt16LE(2);
|
|
199
|
+
const itemState = buffer.readUInt16LE(4);
|
|
200
|
+
const lastTick = buffer.readUInt16LE(6);
|
|
201
|
+
|
|
202
|
+
this.onListItemsByNID.next({
|
|
203
|
+
nid: NID,
|
|
204
|
+
index,
|
|
205
|
+
itemState,
|
|
206
|
+
lastTick,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// 0x07.0x04
|
|
212
|
+
private parseDataClear(
|
|
213
|
+
size: number,
|
|
214
|
+
mode: number,
|
|
215
|
+
nid: number,
|
|
216
|
+
buffer: Buffer,
|
|
217
|
+
) {
|
|
218
|
+
if (this.onRemoveLocomotive.observed) {
|
|
219
|
+
const NID = buffer.readUInt16LE(0);
|
|
220
|
+
const state = buffer.readUInt16LE(2);
|
|
221
|
+
|
|
222
|
+
this.onRemoveLocomotive.next({
|
|
223
|
+
nid: NID,
|
|
224
|
+
state: state,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// 0x07.0x12
|
|
230
|
+
private parseItemImageConfig(
|
|
231
|
+
size: number,
|
|
232
|
+
mode: number,
|
|
233
|
+
nid: number,
|
|
234
|
+
buffer: Buffer,
|
|
235
|
+
) {
|
|
236
|
+
if (this.onItemImageConfig.observed) {
|
|
237
|
+
const NID = buffer.readUInt16LE(0);
|
|
238
|
+
const type = buffer.readUInt16LE(2);
|
|
239
|
+
const imageId = buffer.readUInt16LE(4);
|
|
240
|
+
|
|
241
|
+
this.onItemImageConfig.next({
|
|
242
|
+
nid: NID,
|
|
243
|
+
type,
|
|
244
|
+
imageId,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private parseItemFxInfo(
|
|
250
|
+
size: number,
|
|
251
|
+
mode: number,
|
|
252
|
+
nid: number,
|
|
253
|
+
buffer: Buffer,
|
|
254
|
+
) {
|
|
255
|
+
if (this.onItemFxInfo.observed) {
|
|
256
|
+
const NID = buffer.readUInt16LE(0);
|
|
257
|
+
const fx = buffer.readUInt16LE(2);
|
|
258
|
+
// const base = buffer.readUInt8(4);
|
|
259
|
+
const type = buffer.readUInt8(5);
|
|
260
|
+
const data = buffer.readUInt16LE(6);
|
|
261
|
+
|
|
262
|
+
this.onItemFxInfo.next({
|
|
263
|
+
nid: NID,
|
|
264
|
+
function: fx,
|
|
265
|
+
type,
|
|
266
|
+
data,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// 0x07.0x21
|
|
272
|
+
private parseDataNameExtended(
|
|
273
|
+
size: number,
|
|
274
|
+
mode: number,
|
|
275
|
+
nid: number,
|
|
276
|
+
buffer: Buffer,
|
|
277
|
+
) {
|
|
278
|
+
if (this.onDataNameExtended.observed) {
|
|
279
|
+
const NID = buffer.readUInt16LE(0);
|
|
280
|
+
const subID = buffer.readUInt16LE(2);
|
|
281
|
+
const name = ExtendedASCII.byte2str(buffer.subarray(12, 203));
|
|
282
|
+
|
|
283
|
+
let value1: DataNameValue1 | undefined;
|
|
284
|
+
const value2 = buffer.readUInt32LE(8);
|
|
285
|
+
let type: NameType;
|
|
286
|
+
|
|
287
|
+
switch (NID) {
|
|
288
|
+
case 0x7f00:
|
|
289
|
+
type = NameType.MANUFACTURER;
|
|
290
|
+
break;
|
|
291
|
+
case 0x7f02:
|
|
292
|
+
type = NameType.DECODER;
|
|
293
|
+
break;
|
|
294
|
+
case 0x7f04:
|
|
295
|
+
type = NameType.DESIGNATION;
|
|
296
|
+
value1 = {
|
|
297
|
+
type: buffer.subarray(4).toString('ascii').trim(),
|
|
298
|
+
cfgNum: parseInt(buffer.subarray(5, 7).toString('ascii')),
|
|
299
|
+
};
|
|
300
|
+
break;
|
|
301
|
+
case 0x7f06:
|
|
302
|
+
type = NameType.CFGDB;
|
|
303
|
+
break;
|
|
304
|
+
case 0x7f10:
|
|
305
|
+
type = NameType.ICON;
|
|
306
|
+
break;
|
|
307
|
+
case 0x7f11:
|
|
308
|
+
type = NameType.ICON;
|
|
309
|
+
break;
|
|
310
|
+
case 0x7f18:
|
|
311
|
+
type = NameType.ZIMO_PARTNER;
|
|
312
|
+
break;
|
|
313
|
+
case 0x7f20:
|
|
314
|
+
type = NameType.LAND;
|
|
315
|
+
break;
|
|
316
|
+
case 0x7f21:
|
|
317
|
+
type = NameType.COMPANY_CV;
|
|
318
|
+
break;
|
|
319
|
+
case 0xc2:
|
|
320
|
+
type = NameType.CONNECTION;
|
|
321
|
+
break;
|
|
322
|
+
default:
|
|
323
|
+
if (subID == 1) {
|
|
324
|
+
type = NameType.COMPANY_CV;
|
|
325
|
+
} else if (subID == 0) {
|
|
326
|
+
type = NameType.VEHICLE;
|
|
327
|
+
} else {
|
|
328
|
+
type = NameType.CONNECTION;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
this.onDataNameExtended.next({
|
|
333
|
+
nid: NID,
|
|
334
|
+
type,
|
|
335
|
+
subID,
|
|
336
|
+
value1,
|
|
337
|
+
value2,
|
|
338
|
+
name,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import MX10 from '../MX10';
|
|
3
|
+
import {Buffer} from 'buffer';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @category Groups
|
|
8
|
+
*/
|
|
9
|
+
export default class FileControlGroup {
|
|
10
|
+
private mx10: MX10;
|
|
11
|
+
|
|
12
|
+
constructor(mx10: MX10) {
|
|
13
|
+
this.mx10 = mx10;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
parse(
|
|
17
|
+
size: number,
|
|
18
|
+
command: number,
|
|
19
|
+
mode: number,
|
|
20
|
+
nid: number,
|
|
21
|
+
buffer: Buffer,
|
|
22
|
+
) {
|
|
23
|
+
// console.log('parse file control group');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import {Buffer} from 'buffer';
|
|
3
|
+
import MX10 from '../MX10';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @category Groups
|
|
8
|
+
*/
|
|
9
|
+
export default class FileTransferGroup {
|
|
10
|
+
private mx10: MX10;
|
|
11
|
+
|
|
12
|
+
constructor(mx10: MX10) {
|
|
13
|
+
this.mx10 = mx10;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
parse(
|
|
17
|
+
size: number,
|
|
18
|
+
command: number,
|
|
19
|
+
mode: number,
|
|
20
|
+
nid: number,
|
|
21
|
+
buffer: Buffer,
|
|
22
|
+
) {
|
|
23
|
+
// console.log('parse file transfer group');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import LanNetworkGroup from './lanNetworkGroup';
|
|
2
|
+
import NetworkGroup from './networkGroup';
|
|
3
|
+
import VehicleGroup from './vehicleGroup';
|
|
4
|
+
import SystemControlGroup from './systemControlGroup';
|
|
5
|
+
import AccessoryCommandGroup from './accessoryCommandGroup';
|
|
6
|
+
import TrainControlGroup from './trainControlGroup';
|
|
7
|
+
import TrackCfgGroup from './trackCfgGroup';
|
|
8
|
+
import DataGroup from './dataGroup';
|
|
9
|
+
import InfoGroup from './infoGroup';
|
|
10
|
+
import PropertyConfigGroup from './propertyConfigGroup';
|
|
11
|
+
import RailwayControlGroup from './railwayControlGroup';
|
|
12
|
+
import ZimoProgrammableScriptGroup from './zimoProgrammableScriptGroup';
|
|
13
|
+
import FileControlGroup from './fileControlGroup';
|
|
14
|
+
import FileTransferGroup from './fileTransferGroup';
|
|
15
|
+
import LanZimoProgrammableScriptGroup from './lanZimoProgrammableScriptGroup';
|
|
16
|
+
import LanInfoGroup from './lanInfoGroup';
|
|
17
|
+
import LanDataGroup from './lanDataGroup';
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
LanNetworkGroup,
|
|
21
|
+
NetworkGroup,
|
|
22
|
+
VehicleGroup,
|
|
23
|
+
SystemControlGroup,
|
|
24
|
+
AccessoryCommandGroup,
|
|
25
|
+
TrainControlGroup,
|
|
26
|
+
TrackCfgGroup,
|
|
27
|
+
DataGroup,
|
|
28
|
+
InfoGroup,
|
|
29
|
+
PropertyConfigGroup,
|
|
30
|
+
RailwayControlGroup,
|
|
31
|
+
ZimoProgrammableScriptGroup,
|
|
32
|
+
FileControlGroup,
|
|
33
|
+
FileTransferGroup,
|
|
34
|
+
LanZimoProgrammableScriptGroup,
|
|
35
|
+
LanInfoGroup,
|
|
36
|
+
LanDataGroup,
|
|
37
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {Buffer} from 'buffer';
|
|
2
|
+
import MX10 from '../MX10';
|
|
3
|
+
import {Subject} from 'rxjs';
|
|
4
|
+
import {BidiInfoData, BidiDirectionData} from '../@types/models';
|
|
5
|
+
import {BidiType, Direction, ForwardOrReverse} from '../util/enums';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @category Groups
|
|
10
|
+
*/
|
|
11
|
+
export default class InfoGroup {
|
|
12
|
+
private mx10: MX10;
|
|
13
|
+
|
|
14
|
+
public readonly onBidiInfoChange = new Subject<BidiInfoData>();
|
|
15
|
+
|
|
16
|
+
constructor(mx10: MX10) {
|
|
17
|
+
this.mx10 = mx10;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
parse(
|
|
21
|
+
size: number,
|
|
22
|
+
command: number,
|
|
23
|
+
mode: number,
|
|
24
|
+
nid: number,
|
|
25
|
+
buffer: Buffer,
|
|
26
|
+
) {
|
|
27
|
+
switch (command) {
|
|
28
|
+
case 0x05:
|
|
29
|
+
this.parseBidiInfo(size, mode, nid, buffer);
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
// eslint-disable-next-line no-console
|
|
33
|
+
console.log('command not parsed: ' + command.toString());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private parseBidiInfo(
|
|
38
|
+
size: number,
|
|
39
|
+
mode: number,
|
|
40
|
+
nid: number,
|
|
41
|
+
buffer: Buffer,
|
|
42
|
+
) {
|
|
43
|
+
if (this.onBidiInfoChange.observed) {
|
|
44
|
+
const NID = buffer.readUInt16LE(0);
|
|
45
|
+
const type = buffer.readUInt16LE(2);
|
|
46
|
+
const info = buffer.readUInt32LE(4);
|
|
47
|
+
|
|
48
|
+
let data: BidiDirectionData | number = {};
|
|
49
|
+
switch (type) {
|
|
50
|
+
case BidiType.DIRECTION:
|
|
51
|
+
data.direction = this.parseEastWest(info);
|
|
52
|
+
data.directionChange = this.parseDirChange(info);
|
|
53
|
+
data.directionConfirm = this.parseDirectionConfirm(info);
|
|
54
|
+
data.forwardOrReverse = this.parseFwdRev(info);
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
data = info;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this.onBidiInfoChange.next({
|
|
61
|
+
nid: NID,
|
|
62
|
+
type,
|
|
63
|
+
data,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private parseEastWest(data: number) {
|
|
69
|
+
if ((data & 0x02) == 0x02) {
|
|
70
|
+
return Direction.EAST;
|
|
71
|
+
} else {
|
|
72
|
+
return Direction.WEST;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private parseDirChange(data: number) {
|
|
77
|
+
return (data & 0x04) == 0x04;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private parseFwdRev(data: number) {
|
|
81
|
+
if ((data & 0x01) == 0) {
|
|
82
|
+
return ForwardOrReverse.REVERSE;
|
|
83
|
+
} else {
|
|
84
|
+
return ForwardOrReverse.FORWARD;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
private parseDirectionConfirm(data: number) {
|
|
88
|
+
return (data & 0x08) == 0x08;
|
|
89
|
+
}
|
|
90
|
+
}
|