11import { Converters } from "./converters" ;
2- import { DataField } from "./data-field" ;
2+ import { AddressBoolean , AddressQuantity , AddressQuantityBooleans , AddressQuantityRegisters , AddressRegister , Booleans , DataFieldStrategy , Registers } from "./data-field" ;
33
44interface FunctionCodeDetails {
55 readonly code : number ;
66 readonly description : string ;
7- readonly masterRequestStrategy ?: DataField ;
8- readonly slaveResponseStrategy ?: DataField ;
7+ readonly masterRequestStrategy ?: DataFieldStrategy ;
8+ readonly slaveResponseStrategy ?: DataFieldStrategy ;
99}
1010
1111const allFunctionCodeDetails : ReadonlySet < FunctionCodeDetails > = new Set < FunctionCodeDetails > ( [
12- { code : 0x01 , description : 'Read Coils' } ,
13- { code : 0x02 , description : 'Read Discrete Inputs' } ,
14- { code : 0x03 , description : 'Read Holding Registers' } ,
15- { code : 0x04 , description : 'Read Input Registers' } ,
16- { code : 0x05 , description : 'Write Single Coil' } ,
17- { code : 0x06 , description : 'Write Single Register' } ,
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 } ,
1818 { code : 0x07 , description : 'Read Exceptions Status' } ,
1919 { code : 0x08 , description : 'Diagnostic Test' } ,
20- { code : 0x0f , description : 'Write Multiple Coils' } ,
21- { code : 0x10 , description : 'Write Multiple Registers' } ,
20+ { code : 0x0f , description : 'Write Multiple Coils' , masterRequestStrategy : AddressQuantityBooleans , slaveResponseStrategy : AddressQuantity } ,
21+ { code : 0x10 , description : 'Write Multiple Registers' , masterRequestStrategy : AddressQuantityRegisters , slaveResponseStrategy : AddressQuantity } ,
2222 { code : 0x11 , description : 'Identify Device Server' } ,
2323 { code : 0x81 , description : 'Illegal Function' } ,
2424 { code : 0x82 , description : 'Illegal Data Address' } ,
@@ -33,7 +33,17 @@ const allFunctionCodeDetails: ReadonlySet<FunctionCodeDetails> = new Set<Functio
3333] ) ;
3434
3535export class FunctionCodes {
36- static descriptions : ReadonlyMap < number , string > = new Map < number , string > ( [ ...allFunctionCodeDetails ] . map ( ( it ) => [ it . code , it . description ] ) ) ;
36+ static descriptions : ReadonlyMap < number , string > = new Map < number , string > ( [ ...allFunctionCodeDetails ]
37+ . map ( ( it ) => [ it . code , it . description ] )
38+ ) ;
39+ static masterRequestStrategies : ReadonlyMap < number , DataFieldStrategy > = new Map < number , DataFieldStrategy > ( [ ...allFunctionCodeDetails ]
40+ . filter ( ( it ) => it . masterRequestStrategy )
41+ . map ( ( it ) => [ it . code , it . masterRequestStrategy ! ] )
42+ ) ;
43+ static slaveResponseStrategies : ReadonlyMap < number , DataFieldStrategy > = new Map < number , DataFieldStrategy > ( [ ...allFunctionCodeDetails ]
44+ . filter ( ( it ) => it . slaveResponseStrategy )
45+ . map ( ( it ) => [ it . code , it . slaveResponseStrategy ! ] )
46+ ) ;
3747
3848 static getDescription ( code : number | undefined ) : string {
3949 if ( code === undefined ) {
@@ -53,4 +63,21 @@ export class FunctionCodes {
5363 static isError ( code : number ) : boolean {
5464 return ! ! ( code & 0x80 ) ;
5565 }
66+
67+ static newMasterRequest ( code : number , dataFieldBytes : number [ ] ) : Object | undefined {
68+ const strategy = this . masterRequestStrategies . get ( code ) ;
69+ return this . _newDataFieldStrategy ( strategy , dataFieldBytes ) ;
70+ }
71+
72+ static newSlaveResponse ( code : number , dataFieldBytes : number [ ] ) : Object | undefined {
73+ const strategy = this . slaveResponseStrategies . get ( code ) ;
74+ return this . _newDataFieldStrategy ( strategy , dataFieldBytes ) ;
75+ }
76+
77+ private static _newDataFieldStrategy ( strategy : DataFieldStrategy | undefined , dataFieldBytes : number [ ] ) : Object | undefined {
78+ if ( strategy ) {
79+ return new strategy ( dataFieldBytes ) ;
80+ }
81+ return undefined ;
82+ }
5683}
0 commit comments