@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.
Files changed (202) hide show
  1. package/.dockerignore +7 -0
  2. package/.editorconfig +15 -0
  3. package/.eslintignore +7 -0
  4. package/.eslintrc.cjs +17 -0
  5. package/.gitattributes +1 -0
  6. package/.github/workflows/docs.yml +46 -0
  7. package/.github/workflows/library.yml +59 -0
  8. package/.nvmrc +1 -0
  9. package/.prettierignore +14 -0
  10. package/.prettierrc.json +8 -0
  11. package/LICENSE.md +21 -0
  12. package/README.md +8 -0
  13. package/__tests__/connection.test.ts +58 -0
  14. package/__tests__/dataGroup.test.ts +98 -0
  15. package/__tests__/infoGroup.test.ts +30 -0
  16. package/__tests__/lanDataGroup.test.ts +82 -0
  17. package/__tests__/lanInfoGroup.test.ts +41 -0
  18. package/__tests__/systemControlGroup.test.ts +42 -0
  19. package/__tests__/trackCfgGroup.test.ts +43 -0
  20. package/__tests__/util/index.ts +14 -0
  21. package/__tests__/vehicleGroup.test.ts +128 -0
  22. package/dist/@types/communication.d.ts +30 -0
  23. package/dist/@types/communication.js +2 -0
  24. package/dist/@types/communication.js.map +1 -0
  25. package/dist/@types/models.d.ts +172 -0
  26. package/dist/@types/models.js +2 -0
  27. package/dist/@types/models.js.map +1 -0
  28. package/dist/MX10.d.ts +45 -0
  29. package/dist/MX10.js +233 -0
  30. package/dist/MX10.js.map +1 -0
  31. package/dist/docs_entrypoint.d.ts +6 -0
  32. package/dist/docs_entrypoint.js +7 -0
  33. package/dist/docs_entrypoint.js.map +1 -0
  34. package/dist/index.d.ts +6 -0
  35. package/dist/index.js +7 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/internal/bites.d.ts +9 -0
  38. package/dist/internal/bites.js +10 -0
  39. package/dist/internal/bites.js.map +1 -0
  40. package/dist/internal/speedUtils.d.ts +9 -0
  41. package/dist/internal/speedUtils.js +29 -0
  42. package/dist/internal/speedUtils.js.map +1 -0
  43. package/dist/internal/utils.d.ts +1 -0
  44. package/dist/internal/utils.js +4 -0
  45. package/dist/internal/utils.js.map +1 -0
  46. package/dist/util/enums.d.ts +113 -0
  47. package/dist/util/enums.js +137 -0
  48. package/dist/util/enums.js.map +1 -0
  49. package/dist/util/extended-ascii.d.ts +7 -0
  50. package/dist/util/extended-ascii.js +162 -0
  51. package/dist/util/extended-ascii.js.map +1 -0
  52. package/dist/zcan/accessoryCommandGroup.d.ts +6 -0
  53. package/dist/zcan/accessoryCommandGroup.js +9 -0
  54. package/dist/zcan/accessoryCommandGroup.js.map +1 -0
  55. package/dist/zcan/dataGroup.d.ts +31 -0
  56. package/dist/zcan/dataGroup.js +233 -0
  57. package/dist/zcan/dataGroup.js.map +1 -0
  58. package/dist/zcan/fileControlGroup.d.ts +7 -0
  59. package/dist/zcan/fileControlGroup.js +9 -0
  60. package/dist/zcan/fileControlGroup.js.map +1 -0
  61. package/dist/zcan/fileTransferGroup.d.ts +7 -0
  62. package/dist/zcan/fileTransferGroup.js +9 -0
  63. package/dist/zcan/fileTransferGroup.js.map +1 -0
  64. package/dist/zcan/index.d.ts +18 -0
  65. package/dist/zcan/index.js +19 -0
  66. package/dist/zcan/index.js.map +1 -0
  67. package/dist/zcan/infoGroup.d.ts +15 -0
  68. package/dist/zcan/infoGroup.js +64 -0
  69. package/dist/zcan/infoGroup.js.map +1 -0
  70. package/dist/zcan/lanDataGroup.d.ts +23 -0
  71. package/dist/zcan/lanDataGroup.js +226 -0
  72. package/dist/zcan/lanDataGroup.js.map +1 -0
  73. package/dist/zcan/lanInfoGroup.d.ts +11 -0
  74. package/dist/zcan/lanInfoGroup.js +58 -0
  75. package/dist/zcan/lanInfoGroup.js.map +1 -0
  76. package/dist/zcan/lanNetworkGroup.d.ts +11 -0
  77. package/dist/zcan/lanNetworkGroup.js +37 -0
  78. package/dist/zcan/lanNetworkGroup.js.map +1 -0
  79. package/dist/zcan/lanZimoProgrammableScriptGroup.d.ts +7 -0
  80. package/dist/zcan/lanZimoProgrammableScriptGroup.js +9 -0
  81. package/dist/zcan/lanZimoProgrammableScriptGroup.js.map +1 -0
  82. package/dist/zcan/networkGroup.d.ts +10 -0
  83. package/dist/zcan/networkGroup.js +38 -0
  84. package/dist/zcan/networkGroup.js.map +1 -0
  85. package/dist/zcan/propertyConfigGroup.d.ts +7 -0
  86. package/dist/zcan/propertyConfigGroup.js +9 -0
  87. package/dist/zcan/propertyConfigGroup.js.map +1 -0
  88. package/dist/zcan/railwayControlGroup.d.ts +7 -0
  89. package/dist/zcan/railwayControlGroup.js +9 -0
  90. package/dist/zcan/railwayControlGroup.js.map +1 -0
  91. package/dist/zcan/systemControlGroup.d.ts +13 -0
  92. package/dist/zcan/systemControlGroup.js +35 -0
  93. package/dist/zcan/systemControlGroup.js.map +1 -0
  94. package/dist/zcan/trackCfgGroup.d.ts +16 -0
  95. package/dist/zcan/trackCfgGroup.js +77 -0
  96. package/dist/zcan/trackCfgGroup.js.map +1 -0
  97. package/dist/zcan/trainControlGroup.d.ts +8 -0
  98. package/dist/zcan/trainControlGroup.js +19 -0
  99. package/dist/zcan/trainControlGroup.js.map +1 -0
  100. package/dist/zcan/vehicleGroup.d.ts +26 -0
  101. package/dist/zcan/vehicleGroup.js +145 -0
  102. package/dist/zcan/vehicleGroup.js.map +1 -0
  103. package/dist/zcan/zimoProgrammableScriptGroup.d.ts +7 -0
  104. package/dist/zcan/zimoProgrammableScriptGroup.js +9 -0
  105. package/dist/zcan/zimoProgrammableScriptGroup.js.map +1 -0
  106. package/gulpfile.js +37 -0
  107. package/jest.config.js +26 -0
  108. package/package.json +50 -0
  109. package/protocol_docs/README.md +41 -0
  110. package/protocol_docs/babel.config.js +3 -0
  111. package/protocol_docs/docs/command-groups/_category_.json +4 -0
  112. package/protocol_docs/docs/command-groups/accessories/_category_.json +4 -0
  113. package/protocol_docs/docs/command-groups/accessories/accessory-state.md +7 -0
  114. package/protocol_docs/docs/command-groups/command-groups.md +50 -0
  115. package/protocol_docs/docs/command-groups/data/_category_.json +4 -0
  116. package/protocol_docs/docs/command-groups/data/data-name-extended.md +60 -0
  117. package/protocol_docs/docs/command-groups/data/group-count.md +52 -0
  118. package/protocol_docs/docs/command-groups/data/item-fx-info.md +27 -0
  119. package/protocol_docs/docs/command-groups/data/item-image-config.md +44 -0
  120. package/protocol_docs/docs/command-groups/data/item-list-by-index.md +45 -0
  121. package/protocol_docs/docs/command-groups/data/item-list-by-nid.md +43 -0
  122. package/protocol_docs/docs/command-groups/data/remove-train.md +33 -0
  123. package/protocol_docs/docs/command-groups/info/_category_.json +4 -0
  124. package/protocol_docs/docs/command-groups/info/bidi-info.md +34 -0
  125. package/protocol_docs/docs/command-groups/lan-data/_category_.json +4 -0
  126. package/protocol_docs/docs/command-groups/lan-data/data-value-extended.md +65 -0
  127. package/protocol_docs/docs/command-groups/lan-data/loco-gui-extended.md +48 -0
  128. package/protocol_docs/docs/command-groups/lan-info/_category_.json +4 -0
  129. package/protocol_docs/docs/command-groups/lan-info/module-power-info.md +26 -0
  130. package/protocol_docs/docs/command-groups/lan-network/_category_.json +4 -0
  131. package/protocol_docs/docs/command-groups/lan-network/open-port.md +47 -0
  132. package/protocol_docs/docs/command-groups/network/_category_.json +4 -0
  133. package/protocol_docs/docs/command-groups/network/ping.md +49 -0
  134. package/protocol_docs/docs/command-groups/system/_category_.json +4 -0
  135. package/protocol_docs/docs/command-groups/system/system-state.md +59 -0
  136. package/protocol_docs/docs/command-groups/track/_category_.json +4 -0
  137. package/protocol_docs/docs/command-groups/track/tse-prog-read.md +37 -0
  138. package/protocol_docs/docs/command-groups/track/tse-prog-write.md +35 -0
  139. package/protocol_docs/docs/command-groups/train/_category_.json +4 -0
  140. package/protocol_docs/docs/command-groups/train/train-part-find.md +33 -0
  141. package/protocol_docs/docs/command-groups/vehicles/_category_.json +4 -0
  142. package/protocol_docs/docs/command-groups/vehicles/vehicle-function.md +36 -0
  143. package/protocol_docs/docs/command-groups/vehicles/vehicle-mode.md +143 -0
  144. package/protocol_docs/docs/command-groups/vehicles/vehicle-special-function-switch.md +35 -0
  145. package/protocol_docs/docs/command-groups/vehicles/vehicle-speed.md +55 -0
  146. package/protocol_docs/docs/description.md +4 -0
  147. package/protocol_docs/docs/introduction/_category_.json +4 -0
  148. package/protocol_docs/docs/introduction/how-it-works.md +61 -0
  149. package/protocol_docs/docs/introduction/implementation.md +39 -0
  150. package/protocol_docs/docs/introduction/interface.md +62 -0
  151. package/protocol_docs/docs/introduction/introduction.md +82 -0
  152. package/protocol_docs/docusaurus.config.js +111 -0
  153. package/protocol_docs/package-lock.json +25611 -0
  154. package/protocol_docs/package.json +47 -0
  155. package/protocol_docs/sidebars.js +22 -0
  156. package/protocol_docs/src/components/CommandAndGroup/index.tsx +16 -0
  157. package/protocol_docs/src/components/CommandAndGroup/styles.module.css +12 -0
  158. package/protocol_docs/src/components/HomepageFeatures/index.tsx +70 -0
  159. package/protocol_docs/src/components/HomepageFeatures/styles.module.css +11 -0
  160. package/protocol_docs/src/css/custom.css +76 -0
  161. package/protocol_docs/src/pages/index.module.css +23 -0
  162. package/protocol_docs/src/pages/index.tsx +41 -0
  163. package/protocol_docs/src/pages/markdown-page.md +7 -0
  164. package/protocol_docs/static/.nojekyll +0 -0
  165. package/protocol_docs/static/img/docusaurus.png +0 -0
  166. package/protocol_docs/static/img/favicon.ico +0 -0
  167. package/protocol_docs/static/img/undraw_docusaurus_mountain.svg +171 -0
  168. package/protocol_docs/static/img/undraw_docusaurus_react.svg +170 -0
  169. package/protocol_docs/static/img/undraw_docusaurus_tree.svg +40 -0
  170. package/protocol_docs/static/typedoc/index.html +10 -0
  171. package/protocol_docs/tsconfig.json +7 -0
  172. package/src/@types/communication.ts +73 -0
  173. package/src/@types/models.ts +215 -0
  174. package/src/MX10.ts +351 -0
  175. package/src/docs_entrypoint.ts +34 -0
  176. package/src/index.ts +8 -0
  177. package/src/internal/bites.ts +11 -0
  178. package/src/internal/speedUtils.ts +36 -0
  179. package/src/internal/utils.ts +3 -0
  180. package/src/util/enums.ts +147 -0
  181. package/src/util/extended-ascii.ts +179 -0
  182. package/src/zcan/accessoryCommandGroup.ts +24 -0
  183. package/src/zcan/dataGroup.ts +342 -0
  184. package/src/zcan/fileControlGroup.ts +25 -0
  185. package/src/zcan/fileTransferGroup.ts +25 -0
  186. package/src/zcan/index.ts +37 -0
  187. package/src/zcan/infoGroup.ts +90 -0
  188. package/src/zcan/lanDataGroup.ts +361 -0
  189. package/src/zcan/lanInfoGroup.ts +86 -0
  190. package/src/zcan/lanNetworkGroup.ts +70 -0
  191. package/src/zcan/lanZimoProgrammableScriptGroup.ts +25 -0
  192. package/src/zcan/networkGroup.ts +71 -0
  193. package/src/zcan/propertyConfigGroup.ts +25 -0
  194. package/src/zcan/railwayControlGroup.ts +25 -0
  195. package/src/zcan/systemControlGroup.ts +62 -0
  196. package/src/zcan/trackCfgGroup.ts +109 -0
  197. package/src/zcan/trainControlGroup.ts +48 -0
  198. package/src/zcan/vehicleGroup.ts +267 -0
  199. package/src/zcan/zimoProgrammableScriptGroup.ts +25 -0
  200. package/tsconfig.build.json +12 -0
  201. package/tsconfig.json +49 -0
  202. 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
+ }