@zimo-elektronik/zcan 1.0.50 → 1.0.52

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.
@@ -1,27 +1,27 @@
1
1
  import {createMX10, initConnection} from './util';
2
2
  import {afterAll, beforeAll, expect, it} from '@jest/globals';
3
3
  import {firstValueFrom} from 'rxjs';
4
- import {delay} from '../src/internal/utils';
4
+ import { delay } from '../src/common/utils';
5
5
 
6
6
  describe('LocoState group tests - 0x12', () => {
7
- const mx10 = createMX10();
8
- const testNID = 3;
7
+ const mx10 = createMX10();
8
+ const testNID = 3;
9
9
 
10
- beforeAll(async () => {
11
- await initConnection(mx10);
12
- });
10
+ beforeAll(async () => {
11
+ await initConnection(mx10);
12
+ });
13
13
 
14
- afterAll(() => {
15
- delay(1000).then(() => {
16
- mx10.closeSocket();
17
- });
18
- });
14
+ afterAll(() => {
15
+ delay(1000).then(() => {
16
+ mx10.closeSocket();
17
+ });
18
+ });
19
19
 
20
- it('0x00 - retrieve loco state', async () => {
21
- const data = await firstValueFrom(mx10.lanLocoState.onLocoStateExtended);
20
+ it('0x00 - retrieve loco state', async () => {
21
+ const data = await firstValueFrom(mx10.lanLocoState.onLocoStateExtended);
22
22
 
23
- expect(data.nid).toBe(testNID);
24
- // testing on device ZimoApp
25
- expect(data.ownerNid).toBe(mx10.myNID);
26
- });
23
+ expect(data.nid).toBe(testNID);
24
+ // testing on device ZimoApp
25
+ expect(data.ownerNid).toBe(mx10.myNID);
26
+ });
27
27
  });
@@ -1,42 +1,42 @@
1
1
  import {afterAll, beforeAll, describe, expect, jest} from '@jest/globals';
2
2
  import {createMX10, initConnection} from './util';
3
3
  import {SystemStateData, SystemStateMode} from '../src';
4
- import {delay} from '../src/internal/utils';
4
+ import { delay } from '../src/common/utils';
5
5
 
6
6
  describe('System Control Group group tests - 0x00', () => {
7
- const mx10 = createMX10();
8
-
9
- beforeAll(async () => {
10
- await initConnection(mx10);
11
- });
12
-
13
- afterAll(() => {
14
- mx10.systemControl.systemState(SystemStateMode.NORMAL);
15
-
16
- delay(1000).then(() => {
17
- mx10.closeSocket();
18
- });
19
- });
20
-
21
- test.each<{mode: number}>([
22
- {mode: SystemStateMode.SSPe},
23
- {mode: SystemStateMode.OFF},
24
- {mode: SystemStateMode.SSP0},
25
- ])('0x00 - System state test', ({mode}, done) => {
26
- mx10.systemControl.systemState(mode);
27
-
28
- const callback = jest.fn((data: SystemStateData) => {
29
- if (data.nid === mx10.mx10NID) {
30
- expect(data.port).toBeDefined();
31
- expect(data.mode).toBe(mode);
32
-
33
- if (callback.mock.calls.length === 3) {
34
- sub.unsubscribe();
35
- done();
36
- }
37
- }
38
- });
39
-
40
- const sub = mx10.systemControl.onSystemStateChange.subscribe(callback);
41
- });
7
+ const mx10 = createMX10();
8
+
9
+ beforeAll(async () => {
10
+ await initConnection(mx10);
11
+ });
12
+
13
+ afterAll(() => {
14
+ mx10.systemControl.systemState(SystemStateMode.NORMAL);
15
+
16
+ delay(1000).then(() => {
17
+ mx10.closeSocket();
18
+ });
19
+ });
20
+
21
+ test.each<{mode: number}>([
22
+ {mode: SystemStateMode.SSPe},
23
+ {mode: SystemStateMode.OFF},
24
+ {mode: SystemStateMode.SSP0},
25
+ ])('0x00 - System state test', ({mode}, done) => {
26
+ mx10.systemControl.systemState(mode);
27
+
28
+ const callback = jest.fn((data: SystemStateData) => {
29
+ if (data.nid === mx10.mx10NID) {
30
+ expect(data.port).toBeDefined();
31
+ expect(data.mode).toBe(mode);
32
+
33
+ if (callback.mock.calls.length === 3) {
34
+ sub.unsubscribe();
35
+ done();
36
+ }
37
+ }
38
+ });
39
+
40
+ const sub = mx10.systemControl.onSystemStateChange.subscribe(callback);
41
+ });
42
42
  });
@@ -2,42 +2,42 @@ import {createMX10, initConnection} from './util';
2
2
  import {afterAll, beforeAll, describe, it, expect} from '@jest/globals';
3
3
 
4
4
  describe('LAN Data group tests - 0x16', () => {
5
- const mx10 = createMX10();
6
-
7
- beforeAll(async () => {
8
- await initConnection(mx10);
9
- });
10
-
11
- afterAll(() => {
12
- mx10.closeSocket();
13
- });
14
-
15
- it('0x08 - Tse Prog Read Extended', (done) => {
16
- mx10.trackCfg.tseProgRead(211, 8);
17
-
18
- const prog = mx10.trackCfg.onTseProgReadExtended.subscribe((data) => {
19
- expect(data.cfgNum).toBeDefined();
20
- expect(data.cfgNum).toBe(8);
21
- expect(data.cvValue).toBeDefined();
22
- expect(data.cvValue).toBe(145);
23
-
24
- prog.unsubscribe();
25
- done();
26
- });
27
- });
28
-
29
- it('0x09 - Tse Prog Write Extended', (done) => {
30
- // Please be sure if you want to CV write HU value on test
31
- // mx10.trackCfg.tseProgWrite(211, 51, 20);
32
-
33
- const prog = mx10.trackCfg.onTseProgWriteExtended.subscribe((data) => {
34
- expect(data.cfgNum).toBeDefined();
35
- expect(data.cfgNum).toBe(51);
36
- expect(data.cvValue).toBeDefined();
37
- expect(data.cvValue).toBe(20);
38
-
39
- prog.unsubscribe();
40
- done();
41
- });
42
- });
5
+ const mx10 = createMX10();
6
+
7
+ beforeAll(async () => {
8
+ await initConnection(mx10);
9
+ });
10
+
11
+ afterAll(() => {
12
+ mx10.closeSocket();
13
+ });
14
+
15
+ it('0x08 - Tse Prog Read Extended', (done) => {
16
+ mx10.trackCfg.tseProgRead(211, 8);
17
+
18
+ const prog = mx10.trackCfg.onTseProgReadExtended.subscribe((msg) => {
19
+ expect(msg.cvNum()).toBeDefined();
20
+ expect(msg.cvNum()).toBe(8);
21
+ expect(msg.cvVal()).toBeDefined();
22
+ expect(msg.cvVal()).toBe(145);
23
+
24
+ prog.unsubscribe();
25
+ done();
26
+ });
27
+ });
28
+
29
+ it('0x09 - Tse Prog Write Extended', (done) => {
30
+ // Please be sure if you want to CV write HU value on test
31
+ // mx10.trackCfg.tseProgWrite(211, 51, 20);
32
+
33
+ const prog = mx10.trackCfg.onTseProgWriteExtended.subscribe((msg) => {
34
+ expect(msg.cvNum()).toBeDefined();
35
+ expect(msg.cvNum()).toBe(51);
36
+ expect(msg.cvVal()).toBeDefined();
37
+ expect(msg.cvVal()).toBe(20);
38
+
39
+ prog.unsubscribe();
40
+ done();
41
+ });
42
+ });
43
43
  });
@@ -4,114 +4,113 @@ import {firstValueFrom} from 'rxjs';
4
4
  import {delay} from '../src/common/utils';
5
5
  import {Direction, Manual, OperatingMode, ShuntingFunction, SpecialFunctionMode} from '../src';
6
6
 
7
- describe('Vehicle group tests - 0x02', () => {
8
- const mx10 = createMX10();
9
- const testNID = 211;
10
-
11
- beforeAll(async () => {
12
- await initConnection(mx10);
13
- });
14
-
15
- afterAll(() => {
16
- mx10.vehicle.changeSpeed(testNID, 0, true);
17
-
18
- delay(1000).then(() => {
19
- mx10.closeSocket();
20
- });
21
- });
22
-
23
- it('0x00 - retrieve operating state', async () => {
24
- const data = await firstValueFrom(mx10.vehicle.onVehicleState);
25
-
26
- expect(data.nid).toBe(211);
27
- // testing on device ZimoApp
28
- mx10.vehicle.changeSpeed(testNID, 15, true);
29
- expect(data.ctrlDevice).toBe(mx10.myNID);
30
- });
31
-
32
- it('0x01 - retrieve operating mode', async () => {
33
- mx10.vehicle.getVehicleMode(3);
34
- const msg = await firstValueFrom(mx10.vehicle.onVehicleMode);
35
-
36
- expect(msg.trainNid()).toBe(3);
37
- expect(msg.operatingMode()).toBe(OperatingMode.DCC);
38
- });
39
-
40
- test.each([
41
- {nid: testNID, speedStep: 10, forward: true, eastWest: Direction.UNDEFINED},
42
- {nid: testNID, speedStep: 30, forward: false, eastWest: Direction.EAST},
43
- {nid: testNID, speedStep: 40, forward: false, eastWest: Direction.WEST},
44
- {nid: testNID, speedStep: 35, forward: true, eastWest: Direction.WEST},
45
- ])(
46
- '0x02 - change speed and directions',
47
- async ({nid, speedStep, forward, eastWest}) => {
48
- mx10.vehicle.changeSpeed(nid, speedStep, forward, eastWest);
49
- const msg = await firstValueFrom(mx10.vehicle.onVehicleSpeed);
50
- expect(msg).toBeDefined();
51
- expect(msg.trainNid()).toBe(nid);
52
- expect(msg.divisor).toBe(0);
53
- expect(msg.speedStep).toBe(speedStep);
54
- expect(msg.forward).toBe(forward);
55
- expect(msg.eastWest).toBe(eastWest);
56
- expect(msg.emergencyStop).toBe(false);
57
- },
58
- );
59
-
60
- it('0x02 - change speed with bidi feedback', (done) => {
61
- const speedStep = 500,
62
- forward = true;
63
-
64
- const sub = mx10.info.onBidiInfoChange.subscribe((data) => {
65
- if (data.type === 0x0100) {
66
- expect(data).toBeDefined();
67
- expect(data.type).toBe(0x0100);
68
- expect(data.data).toBeGreaterThan(10);
69
-
70
- sub.unsubscribe();
71
- done();
72
- }
73
- });
74
-
75
- mx10.vehicle.changeSpeed(testNID, speedStep, forward);
76
- });
77
-
78
- it('0x04 - call function', async () => {
79
- const nid = testNID,
80
- buttonId = 1;
81
-
82
- mx10.vehicle.callFunction(nid, buttonId, true);
83
- const data = await firstValueFrom(mx10.vehicle.onCallFunction);
84
-
85
- expect(data).toBeDefined();
86
- expect(data.nid).toBe(nid);
87
- expect(data.functionNumber).toBe(buttonId);
88
- expect(data.functionState).toBe(true);
89
-
90
- await delay(500);
91
-
92
- mx10.vehicle.callFunction(nid, buttonId, false);
93
- const data2 = await firstValueFrom(mx10.vehicle.onCallFunction);
94
-
95
- expect(data2).toBeDefined();
96
- expect(data2.nid).toBe(nid);
97
- expect(data2.functionNumber).toBe(buttonId);
98
- expect(data2.functionState).toBe(false);
99
- });
100
-
101
- test.each([
102
- {mode: SpecialFunctionMode.MANUAL, state: Manual.OFF},
103
- {mode: SpecialFunctionMode.SHUNTING_FUNCTION, state: ShuntingFunction.AZBZ},
104
- {
105
- mode: SpecialFunctionMode.DIRECTION_DEFAULT,
106
- state: Direction.WEST,
107
- },
108
- ])('0x05 - special function mode', async ({mode, state}) => {
109
- mx10.vehicle.changeSpecialFunction(testNID, mode, state);
110
- const data = await firstValueFrom(mx10.vehicle.onCallSpecialFunction);
111
-
112
- expect(data).toBeDefined();
113
- expect(data.nid).toBe(testNID);
114
- expect(data.specialFunctionMode).toBe(mode);
115
- expect(data.specialFunctionState).toBe(state);
116
- });
7
+ describe('Vehicle group tests - 0x02', () =>
8
+ {
9
+ const mx10 = createMX10();
10
+ const testNID = 211;
11
+
12
+ beforeAll(async () => {
13
+ await initConnection(mx10);
14
+ });
15
+
16
+ afterAll(() => {
17
+ mx10.vehicle.changeSpeed(testNID, 0, true);
18
+
19
+ delay(1000).then(() => {
20
+ mx10.closeSocket();
21
+ });
22
+ });
23
+
24
+ it('0x00 - retrieve operating state', async () => {
25
+ const msg = await firstValueFrom(mx10.vehicle.onVehicleState);
26
+
27
+ expect(msg.trainNid()).toBe(211);
28
+ // testing on device ZimoApp
29
+ mx10.vehicle.changeSpeed(testNID, 15, true);
30
+ expect(msg.lastCtlNid()).toBe(mx10.myNID);
31
+ });
32
+
33
+ it('0x01 - retrieve operating mode', async () => {
34
+ const msg = await mx10.vehicle.getMode(3);
35
+
36
+ expect(msg?.trainNid()).toBe(3);
37
+ expect(msg?.mode()).toBe(OperatingMode.DCC);
38
+ });
39
+
40
+ test.each([
41
+ {nid: testNID, speedStep: 10, forward: true, eastWest: Direction.UNDEFINED},
42
+ {nid: testNID, speedStep: 30, forward: false, eastWest: Direction.EAST},
43
+ {nid: testNID, speedStep: 40, forward: false, eastWest: Direction.WEST},
44
+ {nid: testNID, speedStep: 35, forward: true, eastWest: Direction.WEST},
45
+ ])(
46
+ '0x02 - change speed and directions',
47
+ async ({nid, speedStep, forward, eastWest}) => {
48
+
49
+ const msg = await mx10.vehicle.setSpeed(nid, speedStep, 0, forward, false, eastWest);
50
+ expect(msg).toBeDefined();
51
+ expect(msg?.trainNid()).toBe(nid);
52
+ expect(msg?.divisor()).toBe(0);
53
+ expect(msg?.speedStep()).toBe(speedStep);
54
+ expect(msg?.forward()).toBe(forward);
55
+ expect(msg?.eastWest()).toBe(eastWest);
56
+ expect(msg?.emergencyStop()).toBe(false);
57
+ },
58
+ );
59
+
60
+ it('0x02 - change speed with bidi feedback', (done) => {
61
+ const speedStep = 500,
62
+ forward = true;
63
+
64
+ const sub = mx10.info.onBidiInfoChange.subscribe((msg) => {
65
+ if (msg.type() === 0x0100) {
66
+ expect(msg).toBeDefined();
67
+ expect(msg.type()).toBe(0x0100);
68
+ expect(msg.info()).toBeGreaterThan(10);
69
+ sub.unsubscribe();
70
+ done();
71
+ }
72
+ });
73
+
74
+ mx10.vehicle.changeSpeed(testNID, speedStep, forward);
75
+ });
76
+
77
+ it('0x04 - call function', async () => {
78
+ const nid = testNID,
79
+ buttonId = 1;
80
+
81
+ mx10.vehicle.callFunction(nid, buttonId, true);
82
+ const data = await firstValueFrom(mx10.vehicle.onCallFunction);
83
+
84
+ expect(data).toBeDefined();
85
+ expect(data.nid).toBe(nid);
86
+ expect(data.functionNumber).toBe(buttonId);
87
+ expect(data.functionState).toBe(true);
88
+
89
+ await delay(500);
90
+
91
+ mx10.vehicle.callFunction(nid, buttonId, false);
92
+ const data2 = await firstValueFrom(mx10.vehicle.onCallFunction);
93
+
94
+ expect(data2).toBeDefined();
95
+ expect(data2.nid).toBe(nid);
96
+ expect(data2.functionNumber).toBe(buttonId);
97
+ expect(data2.functionState).toBe(false);
98
+ });
99
+
100
+ test.each([
101
+ {mode: SpecialFunctionMode.MANUAL, state: Manual.OFF},
102
+ {mode: SpecialFunctionMode.SHUNTING_FUNCTION, state: ShuntingFunction.AZBZ},
103
+ {
104
+ mode: SpecialFunctionMode.DIRECTION_DEFAULT,
105
+ state: Direction.WEST,
106
+ },
107
+ ])('0x05 - special function mode', async ({mode, state}) => {
108
+ mx10.vehicle.changeSpecialFunction(testNID, mode, state);
109
+ const data = await firstValueFrom(mx10.vehicle.onCallSpecialFunction);
110
+
111
+ expect(data).toBeDefined();
112
+ expect(data.nid).toBe(testNID);
113
+ expect(data.specialFunctionMode).toBe(mode);
114
+ expect(data.specialFunctionState).toBe(state);
115
+ });
117
116
  });
@@ -1,4 +1,4 @@
1
- import { NameType, Direction, ExternalController, FunctionMode, OperatingMode, SystemStateMode, TrackMode, ImageType, FxConfigType, SpecialFunctionMode, Manual, ShuntingFunction, BidiType, ForwardOrReverse, AccessoryMode, FxModeType } from './enums';
1
+ import { NameType, Direction, ExternalController, FunctionMode, OperatingMode, SystemStateMode, TrackMode, ImageType, FxConfigType, SpecialFunctionMode, Manual, ShuntingFunction, AccessoryMode, FxModeType } from './enums';
2
2
  import { ZcanDataArray } from './communication';
3
3
  export interface Train {
4
4
  nid: number;
@@ -94,17 +94,6 @@ export interface ModulePowerInfoData {
94
94
  voltageTotal: number;
95
95
  temperature: number;
96
96
  }
97
- export interface BidiInfoData {
98
- nid: number;
99
- type: BidiType;
100
- data: BidiDirectionData | number;
101
- }
102
- export interface BidiDirectionData {
103
- direction?: Direction;
104
- forwardOrReverse?: ForwardOrReverse;
105
- directionChange?: boolean;
106
- directionConfirm?: boolean;
107
- }
108
97
  export interface VehicleStateData {
109
98
  nid: number;
110
99
  ctrlTick: number;
@@ -1,21 +1,18 @@
1
1
  import { Buffer } from 'buffer';
2
2
  import MX10 from '../MX10';
3
3
  import { Subject } from 'rxjs';
4
- import { BidiInfoData } from '../common/models';
5
4
  import { ModInfoType } from '../common/enums';
6
- import { MsgModInfo } from './infoMsg';
5
+ import { MsgBidiInfo, MsgModInfo } from './infoMsg';
7
6
  export default class InfoGroup {
8
7
  private mx10;
9
- readonly onBidiInfoChange: Subject<BidiInfoData>;
8
+ readonly onBidiInfoChange: Subject<MsgBidiInfo>;
10
9
  readonly onModuleInfoChange: Subject<MsgModInfo>;
11
10
  private modInfoQ;
11
+ private bidiQ;
12
12
  constructor(mx10: MX10);
13
13
  getModuleInfo(nid: number, type: ModInfoType | number): Promise<MsgModInfo | undefined>;
14
+ getBidiInfo(locoNid: number, type: number): Promise<MsgBidiInfo | undefined>;
14
15
  parse(size: number, command: number, mode: number, nid: number, buffer: Buffer): void;
15
16
  private parseModuleInfo;
16
17
  private parseBidiInfo;
17
- private parseEastWest;
18
- private parseDirChange;
19
- private parseFwdRev;
20
- private parseDirectionConfirm;
21
18
  }
@@ -1,12 +1,13 @@
1
1
  import { Subject } from 'rxjs';
2
2
  import { Query } from '../common/communication';
3
- import { BidiType, Direction, ForwardOrReverse, MsgMode } from '../common/enums';
4
- import { MsgModInfo } from './infoMsg';
3
+ import { MsgMode } from '../common/enums';
4
+ import { MsgBidiInfo, MsgModInfo } from './infoMsg';
5
5
  export default class InfoGroup {
6
6
  mx10;
7
7
  onBidiInfoChange = new Subject();
8
8
  onModuleInfoChange = new Subject();
9
9
  modInfoQ = undefined;
10
+ bidiQ = undefined;
10
11
  constructor(mx10) {
11
12
  this.mx10 = mx10;
12
13
  }
@@ -34,6 +35,28 @@ export default class InfoGroup {
34
35
  this.modInfoQ = undefined;
35
36
  return rv;
36
37
  }
38
+ async getBidiInfo(locoNid, type) {
39
+ if (this.bidiQ !== undefined && !await this.bidiQ.lock()) {
40
+ this.mx10.logInfo.next("mx10.getBidiInfo: failed to acquire lock");
41
+ return undefined;
42
+ }
43
+ this.bidiQ = new Query(MsgBidiInfo.header(MsgMode.REQ, locoNid), this.onBidiInfoChange);
44
+ this.bidiQ.tx = ((header) => {
45
+ const msg = new MsgBidiInfo(header, type, locoNid);
46
+ this.mx10.logInfo.next('bidi query tx: ' + JSON.stringify(msg));
47
+ this.mx10.sendMsg(msg);
48
+ });
49
+ this.bidiQ.match = ((msg) => {
50
+ this.mx10.logInfo.next('bidi query rx: ' + JSON.stringify(msg));
51
+ return (msg.type() === type);
52
+ });
53
+ this.bidiQ.subscribe(false);
54
+ const rv = await this.bidiQ.run();
55
+ this.mx10.logInfo.next("mx10.getBidiInfo.rv: " + JSON.stringify(rv));
56
+ this.bidiQ.unlock();
57
+ this.bidiQ = undefined;
58
+ return rv;
59
+ }
37
60
  parse(size, command, mode, nid, buffer) {
38
61
  switch (command) {
39
62
  case 0x05:
@@ -61,34 +84,8 @@ export default class InfoGroup {
61
84
  const NID = buffer.readUInt16LE(0);
62
85
  const type = buffer.readUInt16LE(2);
63
86
  const info = buffer.readUInt32LE(4);
64
- let data = {};
65
- switch (type) {
66
- case BidiType.DIRECTION:
67
- data.direction = this.parseEastWest(info);
68
- data.directionChange = this.parseDirChange(info);
69
- data.directionConfirm = this.parseDirectionConfirm(info);
70
- data.forwardOrReverse = this.parseFwdRev(info);
71
- break;
72
- default:
73
- data = info;
74
- }
75
- this.onBidiInfoChange.next({ nid: NID, type, data, });
76
- }
77
- parseEastWest(data) {
78
- if ((data & 0x02) == 0x02)
79
- return Direction.EAST;
80
- return Direction.WEST;
81
- }
82
- parseDirChange(data) {
83
- return (data & 0x04) == 0x04;
84
- }
85
- parseFwdRev(data) {
86
- if ((data & 0x01) == 0)
87
- return ForwardOrReverse.REVERSE;
88
- return ForwardOrReverse.FORWARD;
89
- }
90
- parseDirectionConfirm(data) {
91
- return (data & 0x08) == 0x08;
87
+ const msg = new MsgBidiInfo(MsgBidiInfo.header(mode, NID), type, undefined, info);
88
+ this.onBidiInfoChange.next(msg);
92
89
  }
93
90
  }
94
91
  //# sourceMappingURL=infoGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"infoGroup.js","sourceRoot":"","sources":["../../src/info/infoGroup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"infoGroup.js","sourceRoot":"","sources":["../../src/info/infoGroup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,KAAK,EAAC,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAc,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAC,WAAW,EAAE,UAAU,EAAC,MAAM,WAAW,CAAC;AAMlD,MAAM,CAAC,OAAO,OAAO,SAAS;IAErB,IAAI,CAAO;IAEH,gBAAgB,GAAG,IAAI,OAAO,EAAe,CAAC;IAC9C,kBAAkB,GAAG,IAAI,OAAO,EAAc,CAAC;IAEvD,QAAQ,GAAkC,SAAS,CAAC;IACpD,KAAK,GAAmC,SAAS,CAAC;IAE1D,YAAY,IAAU;QAErB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,IAA0B;QAE1D,IAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YACrE,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxF,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAY;QAE9C,IAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY,EAAE,GAAW,EAAE,MAAc;QAE7E,QAAQ,OAAO,EAAE,CAAC;YACjB,KAAK,IAAI;gBACR,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC5C,MAAM;YACP,KAAK,IAAI;gBACR,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC9C,MAAM;YACP;gBACC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,OAAO,GAAG,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACpG,CAAC;IACF,CAAC;IAEO,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,MAAc;QAE9E,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAE3F,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,MAAc;QAE5E,IAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ;YACjC,OAAO;QAER,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEpC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAClF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CAwBD"}
@@ -6,3 +6,14 @@ export declare class MsgModInfo extends Message {
6
6
  type(): ModInfoType | undefined;
7
7
  info(): number | undefined;
8
8
  }
9
+ export declare class MsgBidiInfo extends Message {
10
+ static header(mode: MsgMode, nid: number): Header;
11
+ constructor(header: Header, type: number, nid?: number, info?: number);
12
+ nid(): number;
13
+ type(): number;
14
+ info(): number | undefined;
15
+ static dirEast(info: number): boolean;
16
+ static dirChanging(info: number): boolean;
17
+ static dirForward(info: number): boolean;
18
+ static dirConfirm(info: number): boolean;
19
+ }
@@ -1,4 +1,5 @@
1
1
  import { Message } from "../common/communication";
2
+ import { MsgMode } from "../common/enums";
2
3
  export class MsgModInfo extends Message {
3
4
  static header(mode, nid) { return { group: 0x08, cmd: 0x08, mode: mode, nid }; }
4
5
  constructor(header, type, data = []) {
@@ -10,4 +11,33 @@ export class MsgModInfo extends Message {
10
11
  type() { return this.data[0].value; }
11
12
  info() { return this.data.length > 1 ? this.data[1].value : undefined; }
12
13
  }
14
+ export class MsgBidiInfo extends Message {
15
+ static header(mode, nid) { return { group: 0x08, cmd: 0x05, mode: mode, nid }; }
16
+ constructor(header, type, nid, info) {
17
+ super(header);
18
+ if (header.mode === MsgMode.REQ) {
19
+ super.push({ value: nid || 0, length: 2 });
20
+ super.push({ value: type, length: 2 });
21
+ }
22
+ else {
23
+ super.push({ value: type, length: 2 });
24
+ super.push({ value: info || 0, length: 4 });
25
+ }
26
+ }
27
+ nid() { return this.header.mode === MsgMode.REQ ? this.data[0].value : this.header.nid || 0; }
28
+ type() { return this.data[this.header.mode === MsgMode.REQ ? 1 : 0].value; }
29
+ info() { return this.data.length > 1 ? this.data[1].value : undefined; }
30
+ static dirEast(info) {
31
+ return ((info & 0x02) == 0x02);
32
+ }
33
+ static dirChanging(info) {
34
+ return ((info & 0x04) == 0x04);
35
+ }
36
+ static dirForward(info) {
37
+ return ((info & 0x01) == 0x01);
38
+ }
39
+ static dirConfirm(info) {
40
+ return ((info & 0x08) == 0x08);
41
+ }
42
+ }
13
43
  //# sourceMappingURL=infoMsg.js.map