Skip to content

Commit 68b4212

Browse files
committed
Reformat code
1 parent 6fbac2d commit 68b4212

File tree

9 files changed

+132
-73
lines changed

9 files changed

+132
-73
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/node_modules
2-
/pages/main.js
2+
/pages/main.js
3+
.idea/

src/converters.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
export class Converters {
2+
private static textEncoder = new TextEncoder();
3+
24
static byteToHex(value: number): string {
35
return value.toString(16).toUpperCase().padStart(2, '0');
46
}
@@ -7,8 +9,6 @@ export class Converters {
79
return bytes.map((it) => Converters.byteToHex(it)).join('');
810
}
911

10-
private static textEncoder = new TextEncoder();
11-
1212
static textAsUInt8Array(text: string): Uint8Array {
1313
return this.textEncoder.encode(text);
1414
}

src/data-field-strategy.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Converters } from "./converters";
2-
import { getInputChecked } from "./dom";
1+
import {Converters} from "./converters";
2+
import {getInputChecked} from "./dom";
33

44
export interface DataFieldStrategy {
55
new(data: number[]): any;

src/dom.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { Converters } from "./converters";
2-
import { Frame } from "./frame";
3-
import { FunctionCodes } from "./function-codes";
1+
import {Frame} from "./frame";
2+
import {FunctionCodes} from "./function-codes";
43

54
export class TableDataColumn {
65
readonly td: HTMLElement = document.createElement('td');
@@ -59,8 +58,8 @@ export const downloadAllSniffedEntries = (): void => {
5958
};
6059

6160
class DomForm<T> {
62-
private readonly fieldset: HTMLFieldSetElement;
6361
submit?: (data: T) => void;
62+
private readonly fieldset: HTMLFieldSetElement;
6463

6564
constructor(private readonly element: Element) {
6665
this.fieldset = element.querySelector('fieldset')!;
@@ -92,6 +91,7 @@ class DomForm<T> {
9291

9392
class DomText {
9493
private readonly text: Text;
94+
9595
constructor(element: Element) {
9696
this.text = element.appendChild(document.createTextNode(''))
9797
}
@@ -116,29 +116,28 @@ interface SendFormData {
116116
}
117117

118118
export class Dom {
119-
private static readonly errorText = new DomText(document.querySelector('h2.error')!);
120119
static readonly successText = new DomText(document.querySelector('h2.success')!);
120+
static readonly serialForm = new DomForm<ConnectionFormData>(document.querySelector('form[name=serial]')!);
121+
static readonly sendForm = new DomForm<SendFormData>(document.querySelector('form[name=send]')!);
122+
static readonly downloadSnifferButton = document.getElementById('downloadSnifferButton')!;
123+
static readonly clearSnifferButton = document.getElementById('clearSnifferButton')!;
124+
private static readonly errorText = new DomText(document.querySelector('h2.error')!);
125+
private static readonly functionCodeList = document.getElementById('functionCodeList')!;
121126

122127
static reportError(error?: any): void {
123128
console.error(error);
124129
const errorMessage = `Error: ${error}`;
125130
this.errorText.setText(errorMessage);
126131
}
132+
127133
static clearError(): void {
128134
this.errorText.setText(``);
129135
}
130136

131-
static readonly serialForm = new DomForm<ConnectionFormData>(document.querySelector('form[name=serial]')!);
132-
static readonly sendForm = new DomForm<SendFormData>(document.querySelector('form[name=send]')!);
133-
134-
private static readonly functionCodeList = document.getElementById('functionCodeList')!;
135137
static addFunctionCodeListOption(code: number): void {
136138
const option = document.createElement('option');
137139
option.value = code.toString();
138140
option.appendChild(document.createTextNode(FunctionCodes.getDescription(code)));
139141
Dom.functionCodeList.appendChild(option);
140142
}
141-
142-
static readonly downloadSnifferButton = document.getElementById('downloadSnifferButton')!;
143-
static readonly clearSnifferButton = document.getElementById('clearSnifferButton')!;
144143
}

src/frame.ts

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

55
export class Frame {
66
readonly slaveAddress: number;
@@ -27,6 +27,10 @@ export class Frame {
2727
return `${now.toLocaleString()}+${now.getMilliseconds()}ms`;
2828
}
2929

30+
private static conditionalText(condition: boolean, value: string): string {
31+
return condition ? value : '';
32+
}
33+
3034
getDataLength(): number {
3135
return this.data.length;
3236
}
@@ -42,6 +46,10 @@ export class Frame {
4246
];
4347
}
4448

49+
protected getError(e: any): string {
50+
return e.message;
51+
}
52+
4553
private getDataAsText(): string {
4654
if (this.type === 'error') {
4755
return `Invalid frame: 0x${this.hexData}`;
@@ -60,19 +68,11 @@ export class Frame {
6068
}
6169
}
6270

63-
private static conditionalText(condition: boolean, value: string): string {
64-
return condition ? value : '';
65-
}
66-
6771
private isUnknownFunctionCodeStrategy(): boolean {
6872
return !this.masterRequest && !this.slaveResponse;
6973
}
7074

7175
private isNoValidDataFormat(): boolean {
7276
return !this.masterRequest?.object && !this.slaveResponse?.object;
7377
}
74-
75-
protected getError(e: any): string {
76-
return e.message;
77-
}
7878
}

src/function-codes.ts

Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1-
import { Converters } from "./converters";
2-
import { AddressBoolean, AddressQuantity, AddressQuantityBooleans, AddressQuantityRegisters, AddressRegister, Booleans, DataFieldStrategy, Exception, Registers } from "./data-field-strategy";
1+
import {Converters} from "./converters";
2+
import {
3+
AddressBoolean,
4+
AddressQuantity,
5+
AddressQuantityBooleans,
6+
AddressQuantityRegisters,
7+
AddressRegister,
8+
Booleans,
9+
DataFieldStrategy,
10+
Exception,
11+
Registers
12+
} from "./data-field-strategy";
313

414
interface FunctionCodeDetails {
515
readonly code: number;
@@ -9,17 +19,66 @@ interface FunctionCodeDetails {
919
}
1020

1121
const allFunctionCodeDetails: ReadonlySet<FunctionCodeDetails> = new Set<FunctionCodeDetails>([
12-
{ code: 0x01, description: 'Read Coils', masterRequestStrategy: AddressQuantity, slaveResponseStrategy: Booleans },
13-
{ code: 0x02, description: 'Read Discrete Inputs', masterRequestStrategy: AddressQuantity, slaveResponseStrategy: Booleans },
14-
{ code: 0x03, description: 'Read Holding Registers', masterRequestStrategy: AddressQuantity, slaveResponseStrategy: Registers },
15-
{ code: 0x04, description: 'Read Input Registers', masterRequestStrategy: AddressQuantity, slaveResponseStrategy: Registers },
16-
{ code: 0x05, description: 'Write Single Coil', masterRequestStrategy: AddressBoolean, slaveResponseStrategy: AddressBoolean },
17-
{ code: 0x06, description: 'Write Single Register', masterRequestStrategy: AddressRegister, slaveResponseStrategy: AddressRegister },
18-
{ code: 0x07, description: 'Read Exceptions Status' },
19-
{ code: 0x08, description: 'Diagnostic Test' },
20-
{ code: 0x0f, description: 'Write Multiple Coils', masterRequestStrategy: AddressQuantityBooleans, slaveResponseStrategy: AddressQuantity },
21-
{ code: 0x10, description: 'Write Multiple Registers', masterRequestStrategy: AddressQuantityRegisters, slaveResponseStrategy: AddressQuantity },
22-
{ code: 0x11, description: 'Identify Device Server' },
22+
{
23+
code: 0x01,
24+
description: 'Read Coils',
25+
masterRequestStrategy: AddressQuantity,
26+
slaveResponseStrategy: Booleans
27+
},
28+
{
29+
code: 0x02,
30+
description: 'Read Discrete Inputs',
31+
masterRequestStrategy: AddressQuantity,
32+
slaveResponseStrategy: Booleans
33+
},
34+
{
35+
code: 0x03,
36+
description: 'Read Holding Registers',
37+
masterRequestStrategy: AddressQuantity,
38+
slaveResponseStrategy: Registers
39+
},
40+
{
41+
code: 0x04,
42+
description: 'Read Input Registers',
43+
masterRequestStrategy: AddressQuantity,
44+
slaveResponseStrategy: Registers
45+
},
46+
{
47+
code: 0x05,
48+
description: 'Write Single Coil',
49+
masterRequestStrategy: AddressBoolean,
50+
slaveResponseStrategy: AddressBoolean
51+
},
52+
{
53+
code: 0x06,
54+
description: 'Write Single Register',
55+
masterRequestStrategy: AddressRegister,
56+
slaveResponseStrategy: AddressRegister
57+
},
58+
{
59+
code: 0x07,
60+
description: 'Read Exceptions Status'
61+
},
62+
{
63+
code: 0x08,
64+
description: 'Diagnostic Test'
65+
},
66+
{
67+
code: 0x0f,
68+
description: 'Write Multiple Coils',
69+
masterRequestStrategy: AddressQuantityBooleans,
70+
slaveResponseStrategy: AddressQuantity
71+
},
72+
{
73+
code: 0x10,
74+
description: 'Write Multiple Registers',
75+
masterRequestStrategy: AddressQuantityRegisters,
76+
slaveResponseStrategy: AddressQuantity
77+
},
78+
{
79+
code: 0x11,
80+
description: 'Identify Device Server'
81+
},
2382
]);
2483

2584
export type StrategyResult = { object?: Object, error?: string } | undefined;
@@ -48,10 +107,6 @@ export class FunctionCodes {
48107
return this._getDescription(code, '(UNKNOWN)');
49108
}
50109

51-
private static _getDescription(code: number, description: string): string {
52-
return `${code} = 0x${Converters.byteToHex(code)} => ${description} ${this.isError(code) ? '(ERROR)' : ''}`;
53-
}
54-
55110
static isError(code: number): boolean {
56111
return !!(code & 0x80);
57112
}
@@ -64,12 +119,16 @@ export class FunctionCodes {
64119
return this._newDataFieldStrategy(this.isError(code) ? Exception : this.slaveResponseStrategies.get(code), dataFieldBytes);
65120
}
66121

122+
private static _getDescription(code: number, description: string): string {
123+
return `${code} = 0x${Converters.byteToHex(code)} => ${description} ${this.isError(code) ? '(ERROR)' : ''}`;
124+
}
125+
67126
private static _newDataFieldStrategy(strategy: DataFieldStrategy | undefined, dataFieldBytes: number[]): StrategyResult {
68127
if (strategy) {
69128
try {
70-
return { object: new strategy(dataFieldBytes) };
129+
return {object: new strategy(dataFieldBytes)};
71130
} catch (e: any) {
72-
return { error: e.message };
131+
return {error: e.message};
73132
}
74133
}
75134
return undefined;

src/int.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Converters } from "./converters";
2-
import { AsciiModeStrategy, RtuModeStrategy } from "./mode";
1+
import {Converters} from "./converters";
2+
import {AsciiModeStrategy, RtuModeStrategy} from "./mode";
33

44
export const intTest = (): void => {
55
new RtuModeStrategy().receive(new Uint8Array([

src/main.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
/// <reference types="w3c-web-serial" />
22

3-
import { AsciiModeStrategy, ModeStrategy, RtuModeStrategy } from "./mode";
4-
import { clearSniffingTable, Dom, downloadAllSniffedEntries, insertFrameRow } from "./dom";
5-
import { Frame } from "./frame";
6-
import { intTest } from "./int.spec";
7-
import { FunctionCodes } from "./function-codes";
3+
import {AsciiModeStrategy, ModeStrategy, RtuModeStrategy} from "./mode";
4+
import {clearSniffingTable, Dom, downloadAllSniffedEntries, insertFrameRow} from "./dom";
5+
import {Frame} from "./frame";
6+
import {FunctionCodes} from "./function-codes";
87

98
const serial: Serial = navigator.serial;
109
if (!serial) {
@@ -44,7 +43,7 @@ const start = async (serialOptions: SerialOptions, mode: ModeStrategy) => {
4443
const reader: ReadableStreamDefaultReader<Uint8Array> = serialPort.readable.getReader();
4544
try {
4645
while (true) {
47-
const { value, done } = await reader.read();
46+
const {value, done} = await reader.read();
4847
if (done) {
4948
break;
5049
}

src/mode.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { Converters } from "./converters";
2-
import { insertFrameRow } from "./dom";
3-
import { Frame } from "./frame";
1+
import {Converters} from "./converters";
2+
import {insertFrameRow} from "./dom";
3+
import {Frame} from "./frame";
44

55
export const reportFrame = (frame: Frame): void => {
66
insertFrameRow(frame);
77
};
88

99
export abstract class ModeStrategy {
1010
abstract receive(data: Uint8Array): void;
11+
1112
abstract send(bytes: number[]): Uint8Array;
1213
}
1314

@@ -63,11 +64,6 @@ export class RtuModeStrategy extends ModeStrategy {
6364
});
6465
}
6566

66-
private resetFrame(): void {
67-
reportFrame(new Frame(this.history.map((it) => it.byte), 'error'));
68-
this.history = [];
69-
}
70-
7167
send(bytes: number[]): Uint8Array {
7268
const rtuCrc = new RtuCrc();
7369
bytes.forEach((byte) => rtuCrc.updateCrc(byte));
@@ -77,6 +73,11 @@ export class RtuModeStrategy extends ModeStrategy {
7773
//this.receive(result);
7874
return result;
7975
}
76+
77+
private resetFrame(): void {
78+
reportFrame(new Frame(this.history.map((it) => it.byte), 'error'));
79+
this.history = [];
80+
}
8081
}
8182

8283
export class AsciiModeStrategy extends ModeStrategy {
@@ -112,6 +113,16 @@ export class AsciiModeStrategy extends ModeStrategy {
112113
}
113114
}
114115

116+
send(bytes: number[]): Uint8Array {
117+
let lrc = 0;
118+
bytes.forEach((byte) => lrc += byte);
119+
const line = `:${Converters.bytesAsHex(bytes)}${Converters.byteToHex(-lrc & 0xff)}\r\n`;
120+
console.log(bytes, line);
121+
const result = Converters.textAsUInt8Array(line);
122+
//this.receive(result);
123+
return result;
124+
}
125+
115126
private resetFrame(): void {
116127
if (this.frameBytes.length) {
117128
reportFrame(new Frame(this.frameBytes, 'error'));
@@ -123,14 +134,4 @@ export class AsciiModeStrategy extends ModeStrategy {
123134
private updateLrc(byte: number): void {
124135
this.currentLrc += byte;
125136
}
126-
127-
send(bytes: number[]): Uint8Array {
128-
let lrc = 0;
129-
bytes.forEach((byte) => lrc += byte);
130-
const line = `:${Converters.bytesAsHex(bytes)}${Converters.byteToHex(-lrc & 0xff)}\r\n`;
131-
console.log(bytes, line);
132-
const result = Converters.textAsUInt8Array(line);
133-
//this.receive(result);
134-
return result;
135-
}
136137
}

0 commit comments

Comments
 (0)