Skip to content

Commit f8edce4

Browse files
committed
Refactor the frame data field handling
1 parent 2e8e792 commit f8edce4

File tree

3 files changed

+25
-31
lines changed

3 files changed

+25
-31
lines changed
File renamed without changes.

src/frame.ts

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import { Converters } from "./converters";
22
import { Dom, TableColumnButton, TableDataColumn } from "./dom";
3-
import { FunctionCodes } from "./function-codes";
3+
import { FunctionCodes, StrategyResult } from "./function-codes";
44

55
export class Frame {
66
readonly slaveAddress: number;
77
readonly functionCode?: number;
8-
readonly masterRequest?: any;
9-
readonly slaveResponse?: any;
10-
readonly masterRequestError?: string;
11-
readonly slaveResponseError?: string;
8+
readonly masterRequest?: StrategyResult;
9+
readonly slaveResponse?: StrategyResult;
1210
readonly hexData: string;
1311

1412
constructor(readonly data: number[], readonly type: 'error' | 'send' | '') {
@@ -19,16 +17,8 @@ export class Frame {
1917
}
2018
this.hexData = Converters.bytesAsHex(data);
2119
if (type !== 'error') {
22-
try {
23-
this.masterRequest = FunctionCodes.newMasterRequest(this.functionCode!, data);
24-
} catch (e: any) {
25-
this.masterRequestError = this.getError(e);
26-
}
27-
try {
28-
this.slaveResponse = FunctionCodes.newSlaveResponse(this.functionCode!, data);
29-
} catch (e: any) {
30-
this.slaveResponseError = this.getError(e);
31-
}
20+
this.masterRequest = FunctionCodes.newMasterRequest(this.functionCode!, data);
21+
this.slaveResponse = FunctionCodes.newSlaveResponse(this.functionCode!, data);
3222
}
3323
}
3424

@@ -55,21 +45,21 @@ export class Frame {
5545
private getDataAsText(): string {
5646
if (this.type === 'error') {
5747
return `Invalid frame: 0x${this.hexData}`;
58-
} else if (this.isUnknownFrame()) {
59-
return `No strategies to format data field. Raw data field is: 0x${this.hexData}`;
48+
} else if (this.isUnknownFunctionCode()) {
49+
return `No strategy to format data field. Raw data field is: 0x${this.hexData}`;
6050
} else if (this.isNoValidDataFormat()) {
61-
return `This frame format does not fit to the known function code: masterRequestError=${this.masterRequestError}; slaveResponseError=${this.slaveResponseError}; raw data: 0x${this.hexData}`;
51+
return `This frame format does not fit to any known strategies: masterRequestError=${this.masterRequest?.error}; slaveResponseError=${this.slaveResponse?.error}; raw data: 0x${this.hexData}`;
6252
} else {
6353
return `Valid frame: masterRequest=${JSON.stringify(this.masterRequest)}; slaveResponse=${JSON.stringify(this.slaveResponse)}`;
6454
}
6555
}
6656

67-
private isNoValidDataFormat(): boolean {
68-
return !!this.masterRequestError && !!this.slaveResponseError;
57+
private isUnknownFunctionCode(): boolean {
58+
return !this.masterRequest && !this.slaveResponse;
6959
}
7060

71-
private isUnknownFrame(): boolean {
72-
return !this.isNoValidDataFormat() && !this.masterRequest && !this.slaveResponse;
61+
private isNoValidDataFormat(): boolean {
62+
return (!this.masterRequest || !!this.masterRequest?.error) && (!this.slaveResponse || !!this.slaveResponse?.error);
7363
}
7464

7565
protected getError(e: any): string {

src/function-codes.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Converters } from "./converters";
2-
import { AddressBoolean, AddressQuantity, AddressQuantityBooleans, AddressQuantityRegisters, AddressRegister, Booleans, DataFieldStrategy, Registers } from "./data-field";
2+
import { AddressBoolean, AddressQuantity, AddressQuantityBooleans, AddressQuantityRegisters, AddressRegister, Booleans, DataFieldStrategy, Registers } from "./data-field-strategy";
33

44
interface FunctionCodeDetails {
55
readonly code: number;
@@ -32,6 +32,8 @@ const allFunctionCodeDetails: ReadonlySet<FunctionCodeDetails> = new Set<Functio
3232
{ code: 0x91, description: 'Gateway Target Device Failed to Respond' },
3333
]);
3434

35+
export type StrategyResult = { object?: Object, error?: string } | undefined;
36+
3537
export class FunctionCodes {
3638
static descriptions: ReadonlyMap<number, string> = new Map<number, string>([...allFunctionCodeDetails]
3739
.map((it) => [it.code, it.description])
@@ -64,19 +66,21 @@ export class FunctionCodes {
6466
return !!(code & 0x80);
6567
}
6668

67-
static newMasterRequest(code: number, dataFieldBytes: number[]): Object | undefined {
68-
const strategy = this.masterRequestStrategies.get(code);
69-
return this._newDataFieldStrategy(strategy, dataFieldBytes);
69+
static newMasterRequest(code: number, dataFieldBytes: number[]): StrategyResult {
70+
return this._newDataFieldStrategy(this.masterRequestStrategies.get(code), dataFieldBytes);
7071
}
7172

72-
static newSlaveResponse(code: number, dataFieldBytes: number[]): Object | undefined {
73-
const strategy = this.slaveResponseStrategies.get(code);
74-
return this._newDataFieldStrategy(strategy, dataFieldBytes);
73+
static newSlaveResponse(code: number, dataFieldBytes: number[]): StrategyResult {
74+
return this._newDataFieldStrategy(this.slaveResponseStrategies.get(code), dataFieldBytes);
7575
}
7676

77-
private static _newDataFieldStrategy(strategy: DataFieldStrategy | undefined, dataFieldBytes: number[]): Object | undefined {
77+
private static _newDataFieldStrategy(strategy: DataFieldStrategy | undefined, dataFieldBytes: number[]): StrategyResult {
7878
if (strategy) {
79-
return new strategy(dataFieldBytes);
79+
try {
80+
return { object: new strategy(dataFieldBytes) };
81+
} catch (e: any) {
82+
return { error: e.message };
83+
}
8084
}
8185
return undefined;
8286
}

0 commit comments

Comments
 (0)