3030import com .hivemq .edge .adapters .modbus .config .ModbusAdapterConfig ;
3131import com .hivemq .edge .adapters .modbus .config .ModbusDataType ;
3232import io .netty .buffer .ByteBuf ;
33+ import io .netty .buffer .Unpooled ;
3334import io .netty .util .ReferenceCountUtil ;
3435import org .jetbrains .annotations .NotNull ;
3536
37+ import java .nio .ByteBuffer ;
3638import java .nio .charset .StandardCharsets ;
3739import java .time .Duration ;
3840import java .util .concurrent .CompletableFuture ;
@@ -71,14 +73,14 @@ public CompletableFuture<Void> connect() {
7173 /**
7274 * Coils are 1bit.
7375 */
74- public @ NotNull CompletableFuture <DataPoint > readCoils (final int startIdx , final int count , final int unitId ) {
76+ public @ NotNull CompletableFuture <DataPoint > readCoils (final int startIdx , final int unitId ) {
7577 return modbusClient
76- .<ReadCoilsResponse >sendRequest (new ReadCoilsRequest (startIdx , Math .min (count , DEFAULT_MAX_DISCRETE_INPUTS )), unitId )
78+ .<ReadCoilsResponse >sendRequest (new ReadCoilsRequest (startIdx , Math .min (1 , DEFAULT_MAX_DISCRETE_INPUTS )), unitId )
7779 .thenApply (response -> {
7880 try {
7981 final ByteBuf buf = response .getCoilStatus ();
80- return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + count ),
81- convert (buf , ModbusDataType .BOOL , count ));
82+ return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + 1 ),
83+ convert (buf , ModbusDataType .BOOL , 1 ));
8284 } finally {
8385 ReferenceCountUtil .release (response );
8486 }
@@ -88,15 +90,15 @@ public CompletableFuture<Void> connect() {
8890 /**
8991 * Discrete registers are 1bit.
9092 */
91- public @ NotNull CompletableFuture <DataPoint > readDiscreteInput (final int startIdx , final int count , final int unitId ) {
93+ public @ NotNull CompletableFuture <DataPoint > readDiscreteInput (final int startIdx , final int unitId ) {
9294 return modbusClient
93- .<ReadDiscreteInputsResponse >sendRequest (new ReadDiscreteInputsRequest (startIdx , Math .min (count ,
95+ .<ReadDiscreteInputsResponse >sendRequest (new ReadDiscreteInputsRequest (startIdx , Math .min (1 ,
9496 DEFAULT_MAX_DISCRETE_INPUTS )), unitId )
9597 .thenApply (response -> {
9698 try {
9799 final ByteBuf buf = response .getInputStatus ();
98- return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + count ),
99- convert (buf , ModbusDataType .BOOL , count ));
100+ return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + 1 ),
101+ convert (buf , ModbusDataType .BOOL , 1 ));
100102 } finally {
101103 ReferenceCountUtil .release (response );
102104 }
@@ -106,16 +108,16 @@ public CompletableFuture<Void> connect() {
106108 /**
107109 * Holding registers are 16bit.
108110 */
109- public @ NotNull CompletableFuture <DataPoint > readHoldingRegisters (final int startIdx , final int count , final @ NotNull ModbusDataType dataType , final int unitId ) {
111+ public @ NotNull CompletableFuture <DataPoint > readHoldingRegisters (final int startIdx , final @ NotNull ModbusDataType dataType , final int unitId ) {
110112
111113 return modbusClient
112- .<ReadHoldingRegistersResponse >sendRequest (new ReadHoldingRegistersRequest (startIdx , Math .min (count ,
114+ .<ReadHoldingRegistersResponse >sendRequest (new ReadHoldingRegistersRequest (startIdx , Math .min (dataType . nrOfRegistersToRead ,
113115 DEFAULT_MAX_INPUT_REGISTERS )), unitId )
114116 .thenApply (response -> {
115117 try {
116118 final ByteBuf buf = response .getRegisters ();
117- return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + count ),
118- convert (buf , dataType , count ));
119+ return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + dataType . nrOfRegistersToRead ),
120+ convert (buf , dataType , dataType . nrOfRegistersToRead ));
119121 } finally {
120122 ReferenceCountUtil .release (response );
121123 }
@@ -125,15 +127,15 @@ public CompletableFuture<Void> connect() {
125127 /**
126128 * Inout registers are 16bit.
127129 */
128- public @ NotNull CompletableFuture <DataPoint > readInputRegisters (final int startIdx , final int count , final @ NotNull ModbusDataType dataType , final int unitId ) {
130+ public @ NotNull CompletableFuture <DataPoint > readInputRegisters (final int startIdx , final @ NotNull ModbusDataType dataType , final int unitId ) {
129131 return modbusClient
130- .<ReadInputRegistersResponse >sendRequest (new ReadInputRegistersRequest (startIdx , Math .min (count ,
132+ .<ReadInputRegistersResponse >sendRequest (new ReadInputRegistersRequest (startIdx , Math .min (dataType . nrOfRegistersToRead ,
131133 DEFAULT_MAX_INPUT_REGISTERS )), unitId )
132134 .thenApply (response -> {
133135 try {
134136 final ByteBuf buf = response .getRegisters ();
135- return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + count ),
136- convert (buf , dataType , count ));
137+ return dataPointFactory .create ("registers-" + startIdx + "-" + (startIdx + dataType . nrOfRegistersToRead ),
138+ convert (buf , dataType , dataType . nrOfRegistersToRead ));
137139 } finally {
138140 ReferenceCountUtil .release (response );
139141 }
@@ -148,6 +150,7 @@ public CompletableFuture<Void> disconnect() {
148150
149151 private @ NotNull Object convert (
150152 final @ NotNull ByteBuf buffi , final @ NotNull ModbusDataType dataType , final int count ) {
153+ boolean registersLittleEndian = true ;
151154 switch (dataType ) {
152155 case BOOL :
153156 return buffi .readBoolean ();
@@ -156,13 +159,49 @@ public CompletableFuture<Void> disconnect() {
156159 case UINT_16 :
157160 return Short .toUnsignedInt (buffi .readShort ());
158161 case INT_32 :
159- return buffi .readInt ();
162+ if (registersLittleEndian ) {
163+ byte [] bytes = ByteBuffer .allocate (4 ).putInt (-2147483647 ).array ();
164+ byte b1 = buffi .readByte ();
165+ byte b2 = buffi .readByte ();
166+ byte b3 = buffi .readByte ();
167+ byte b4 = buffi .readByte ();
168+ System .out .println ("SINT " + String .format ("%02x" , b1 ) + " " + String .format ("%02x" , b2 ) + " " + String .format ("%02x" , b3 ) + " " + String .format ("%02x" , b4 ));
169+ System .out .println ("SINT " + String .format ("%02x" , bytes [2 ]) + " " + String .format ("%02x" , bytes [3 ]) + " " + String .format ("%02x" , bytes [0 ]) + " " + String .format ("%02x" , bytes [1 ]));
170+ ByteBuffer bb = ByteBuffer .wrap (new byte [] {b3 ,b4 , b1 , b2 });
171+ return bb .getInt ();
172+ } else {
173+ return buffi .readInt ();
174+ }
160175 case UINT_32 :
161- return Integer .toUnsignedLong (buffi .readInt ());
176+ if (registersLittleEndian ) {
177+ byte b1 = buffi .readByte ();
178+ byte b2 = buffi .readByte ();
179+ byte b3 = buffi .readByte ();
180+ byte b4 = buffi .readByte ();
181+ System .out .println ("UINT " + String .format ("%02x" , b1 ) + " " + String .format ("%02x" , b2 ) + " " + String .format ("%02x" , b3 ) + " " + String .format ("%02x" , b4 ));
182+ ByteBuffer bb = ByteBuffer .wrap (new byte [] {b4 ,b3 , b2 , b1 });
183+ return bb .getInt ();
184+ } else {
185+ return buffi .readUnsignedInt ();
186+ }
162187 case INT_64 :
163- return buffi .readLong ();
188+ if (registersLittleEndian ) {
189+ return buffi .readUnsignedShort () + (buffi .readUnsignedShort () << 16 );
190+ } else {
191+ return buffi .readLong ();
192+ }
164193 case FLOAT_32 :
165- return buffi .readFloat ();
194+ if (registersLittleEndian ) {
195+ return buffi .readUnsignedShort () + (buffi .readUnsignedShort () << 16 );
196+ } else {
197+ return buffi .readFloat ();
198+ }
199+ case FLOAT_64 :
200+ if (registersLittleEndian ) {
201+ return buffi .readUnsignedShort () + (buffi .readUnsignedShort () << 16 );
202+ } else {
203+ return buffi .readDouble ();
204+ }
166205 case UTF_8 :
167206 final byte [] bytes = new byte [count * 2 ];
168207 buffi .readBytes (bytes );
0 commit comments