You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/11/11 17:55:01 UTC
[plc4x] branch feature/plc4go updated: - Implemented the correct
KNX floating point decoding
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/plc4go
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feature/plc4go by this push:
new 2b25d39 - Implemented the correct KNX floating point decoding
2b25d39 is described below
commit 2b25d39a81950cff9a281def94ea3246d1004858
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Nov 11 18:54:54 2020 +0100
- Implemented the correct KNX floating point decoding
---
.../language/go/GoLanguageTemplateHelper.java | 4 +-
plc4go/cmd/main/main.go | 1 +
plc4go/go.mod | 1 +
plc4go/go.sum | 2 +
.../readwrite/model/BACnetTagApplicationDouble.go | 2 +-
.../readwrite/model/BACnetTagApplicationReal.go | 2 +-
.../knxnetip/readwrite/model/KnxDatapoint.go | 66 +++++++++++++---------
.../plc4go/modbus/readwrite/model/DataItem.go | 8 +--
.../internal/plc4go/s7/readwrite/model/DataItem.go | 4 +-
plc4go/internal/plc4go/utils/ReadBuffer.go | 61 +++++++++++++++-----
.../resources/protocols/knxnetip/knxnetip.mspec | 1 +
11 files changed, 99 insertions(+), 53 deletions(-)
diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index e75a053..b4552fa 100644
--- a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -301,10 +301,10 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
case FLOAT: {
FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
if (floatTypeReference.getSizeInBits() <= 32) {
- return "io.ReadFloat32(" + floatTypeReference.getSizeInBits() + ")";
+ return "io.ReadFloat32(true, " + floatTypeReference.getExponent() + ", " + floatTypeReference.getMantissa() + ")";
}
if (floatTypeReference.getSizeInBits() <= 64) {
- return "io.ReadFloat64(" + floatTypeReference.getSizeInBits() + ")";
+ return "io.ReadFloat64(true, " + floatTypeReference.getExponent() + ", " + floatTypeReference.getMantissa() + ")";
}
}
case STRING: {
diff --git a/plc4go/cmd/main/main.go b/plc4go/cmd/main/main.go
index ca11c9e..b61336b 100644
--- a/plc4go/cmd/main/main.go
+++ b/plc4go/cmd/main/main.go
@@ -19,4 +19,5 @@
package main
func main() {
+ KnxMain()
}
diff --git a/plc4go/go.mod b/plc4go/go.mod
index f14f276..d6384fd 100644
--- a/plc4go/go.mod
+++ b/plc4go/go.mod
@@ -26,4 +26,5 @@ require (
github.com/ajankovic/xdiff v0.0.1
github.com/icza/bitio v1.0.0
github.com/subchen/go-xmldom v1.1.2
+ github.com/willf/bitset v1.1.11
)
diff --git a/plc4go/go.sum b/plc4go/go.sum
index e7a4d67..5a7055a 100644
--- a/plc4go/go.sum
+++ b/plc4go/go.sum
@@ -16,5 +16,7 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/subchen/go-xmldom v1.1.2 h1:7evI2YqfYYOnuj+PBwyaOZZYjl3iWq35P6KfBUw9jeU=
github.com/subchen/go-xmldom v1.1.2/go.mod h1:6Pg/HuX5/T4Jlj0IPJF1sRxKVoI/rrKP6LIMge9d5/8=
+github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=
+github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
index ad396a4..1d3a687 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
@@ -99,7 +99,7 @@ func (m *BACnetTagApplicationDouble) LengthInBytes() uint16 {
func BACnetTagApplicationDoubleParse(io *utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
// Simple Field (value)
- value, _valueErr := io.ReadFloat64(64)
+ value, _valueErr := io.ReadFloat64(true, 11, 52)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
index fe18b28..2003bb4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
@@ -99,7 +99,7 @@ func (m *BACnetTagApplicationReal) LengthInBytes() uint16 {
func BACnetTagApplicationRealParse(io *utils.ReadBuffer, lengthValueType uint8, extLength uint8) (*BACnetTag, error) {
// Simple Field (value)
- value, _valueErr := io.ReadFloat32(32)
+ value, _valueErr := io.ReadFloat32(true, 8, 23)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
index 09429c2..2dfe421 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
@@ -119,8 +119,13 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
return values.NewPlcSINT(value), nil
case formatName == "F16": // REAL
+ // Reserved Field (Just skip the bytes)
+ if _, _err := io.ReadUint8(8); _err != nil {
+ return nil, errors.New("Error parsing reserved field " + _err.Error())
+ }
+
// Simple Field (value)
- value, _valueErr := io.ReadFloat32(16)
+ value, _valueErr := io.ReadFloat32(true, 4, 11)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
@@ -217,7 +222,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
case formatName == "F32": // REAL
// Simple Field (value)
- value, _valueErr := io.ReadFloat32(32)
+ value, _valueErr := io.ReadFloat32(true, 8, 23)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
@@ -1343,7 +1348,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (tempFlowProdSegmH)
- tempFlowProdSegmH, _tempFlowProdSegmHErr := io.ReadFloat32(16)
+ tempFlowProdSegmH, _tempFlowProdSegmHErr := io.ReadFloat32(true, 4, 11)
if _tempFlowProdSegmHErr != nil {
return nil, errors.New("Error parsing 'tempFlowProdSegmH' field " + _tempFlowProdSegmHErr.Error())
}
@@ -1393,7 +1398,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (roomTemperatureDemand)
- roomTemperatureDemand, _roomTemperatureDemandErr := io.ReadFloat32(16)
+ roomTemperatureDemand, _roomTemperatureDemandErr := io.ReadFloat32(true, 4, 11)
if _roomTemperatureDemandErr != nil {
return nil, errors.New("Error parsing 'roomTemperatureDemand' field " + _roomTemperatureDemandErr.Error())
}
@@ -1436,7 +1441,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (flowTemperatureProdSegmC)
- flowTemperatureProdSegmC, _flowTemperatureProdSegmCErr := io.ReadFloat32(16)
+ flowTemperatureProdSegmC, _flowTemperatureProdSegmCErr := io.ReadFloat32(true, 4, 11)
if _flowTemperatureProdSegmCErr != nil {
return nil, errors.New("Error parsing 'flowTemperatureProdSegmC' field " + _flowTemperatureProdSegmCErr.Error())
}
@@ -1479,7 +1484,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (actualTemperature)
- actualTemperature, _actualTemperatureErr := io.ReadFloat32(16)
+ actualTemperature, _actualTemperatureErr := io.ReadFloat32(true, 4, 11)
if _actualTemperatureErr != nil {
return nil, errors.New("Error parsing 'actualTemperature' field " + _actualTemperatureErr.Error())
}
@@ -1515,7 +1520,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (flowTemperatureDemand)
- flowTemperatureDemand, _flowTemperatureDemandErr := io.ReadFloat32(16)
+ flowTemperatureDemand, _flowTemperatureDemandErr := io.ReadFloat32(true, 4, 11)
if _flowTemperatureDemandErr != nil {
return nil, errors.New("Error parsing 'flowTemperatureDemand' field " + _flowTemperatureDemandErr.Error())
}
@@ -1631,21 +1636,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (temperatureSetpointComfort)
- temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(16)
+ temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointComfortErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointComfort' field " + _temperatureSetpointComfortErr.Error())
}
_map["Struct"] = temperatureSetpointComfort
// Simple Field (temperatureSetpointStandby)
- temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(16)
+ temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointStandbyErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointStandby' field " + _temperatureSetpointStandbyErr.Error())
}
_map["Struct"] = temperatureSetpointStandby
// Simple Field (temperatureSetpointEco)
- temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(16)
+ temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointEcoErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointEco' field " + _temperatureSetpointEcoErr.Error())
}
@@ -1655,21 +1660,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (temperatureSetpointShiftComfort)
- temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(16)
+ temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftComfortErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftComfort' field " + _temperatureSetpointShiftComfortErr.Error())
}
_map["Struct"] = temperatureSetpointShiftComfort
// Simple Field (temperatureSetpointShiftStandby)
- temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(16)
+ temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftStandbyErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftStandby' field " + _temperatureSetpointShiftStandbyErr.Error())
}
_map["Struct"] = temperatureSetpointShiftStandby
// Simple Field (temperatureSetpointShiftEco)
- temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(16)
+ temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftEcoErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftEco' field " + _temperatureSetpointShiftEcoErr.Error())
}
@@ -1679,28 +1684,28 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (temperatureSetpointComfort)
- temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(16)
+ temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointComfortErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointComfort' field " + _temperatureSetpointComfortErr.Error())
}
_map["Struct"] = temperatureSetpointComfort
// Simple Field (temperatureSetpointStandby)
- temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(16)
+ temperatureSetpointStandby, _temperatureSetpointStandbyErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointStandbyErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointStandby' field " + _temperatureSetpointStandbyErr.Error())
}
_map["Struct"] = temperatureSetpointStandby
// Simple Field (temperatureSetpointEco)
- temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(16)
+ temperatureSetpointEco, _temperatureSetpointEcoErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointEcoErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointEco' field " + _temperatureSetpointEcoErr.Error())
}
_map["Struct"] = temperatureSetpointEco
// Simple Field (temperatureSetpointBProt)
- temperatureSetpointBProt, _temperatureSetpointBProtErr := io.ReadFloat32(16)
+ temperatureSetpointBProt, _temperatureSetpointBProtErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointBProtErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointBProt' field " + _temperatureSetpointBProtErr.Error())
}
@@ -1710,28 +1715,28 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (temperatureSetpointLegioProtect)
- temperatureSetpointLegioProtect, _temperatureSetpointLegioProtectErr := io.ReadFloat32(16)
+ temperatureSetpointLegioProtect, _temperatureSetpointLegioProtectErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointLegioProtectErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointLegioProtect' field " + _temperatureSetpointLegioProtectErr.Error())
}
_map["Struct"] = temperatureSetpointLegioProtect
// Simple Field (temperatureSetpointNormal)
- temperatureSetpointNormal, _temperatureSetpointNormalErr := io.ReadFloat32(16)
+ temperatureSetpointNormal, _temperatureSetpointNormalErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointNormalErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointNormal' field " + _temperatureSetpointNormalErr.Error())
}
_map["Struct"] = temperatureSetpointNormal
// Simple Field (temperatureSetpointReduced)
- temperatureSetpointReduced, _temperatureSetpointReducedErr := io.ReadFloat32(16)
+ temperatureSetpointReduced, _temperatureSetpointReducedErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointReducedErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointReduced' field " + _temperatureSetpointReducedErr.Error())
}
_map["Struct"] = temperatureSetpointReduced
// Simple Field (temperatureSetpointFrostProtect)
- temperatureSetpointFrostProtect, _temperatureSetpointFrostProtectErr := io.ReadFloat32(16)
+ temperatureSetpointFrostProtect, _temperatureSetpointFrostProtectErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointFrostProtectErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointFrostProtect' field " + _temperatureSetpointFrostProtectErr.Error())
}
@@ -1741,28 +1746,28 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (temperatureSetpointShiftComfort)
- temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(16)
+ temperatureSetpointShiftComfort, _temperatureSetpointShiftComfortErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftComfortErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftComfort' field " + _temperatureSetpointShiftComfortErr.Error())
}
_map["Struct"] = temperatureSetpointShiftComfort
// Simple Field (temperatureSetpointShiftStandby)
- temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(16)
+ temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftStandbyErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftStandby' field " + _temperatureSetpointShiftStandbyErr.Error())
}
_map["Struct"] = temperatureSetpointShiftStandby
// Simple Field (temperatureSetpointShiftEco)
- temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(16)
+ temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftEcoErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftEco' field " + _temperatureSetpointShiftEcoErr.Error())
}
_map["Struct"] = temperatureSetpointShiftEco
// Simple Field (temperatureSetpointShiftBProt)
- temperatureSetpointShiftBProt, _temperatureSetpointShiftBProtErr := io.ReadFloat32(16)
+ temperatureSetpointShiftBProt, _temperatureSetpointShiftBProtErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftBProtErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftBProt' field " + _temperatureSetpointShiftBProtErr.Error())
}
@@ -2295,21 +2300,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, formatName string) (api.PlcValue, e
_map := map[string]interface{}{}
// Simple Field (temperatureSetpointComfort)
- temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(16)
+ temperatureSetpointComfort, _temperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointComfortErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointComfort' field " + _temperatureSetpointComfortErr.Error())
}
_map["Struct"] = temperatureSetpointComfort
// Simple Field (temperatureSetpointShiftStandby)
- temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(16)
+ temperatureSetpointShiftStandby, _temperatureSetpointShiftStandbyErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftStandbyErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftStandby' field " + _temperatureSetpointShiftStandbyErr.Error())
}
_map["Struct"] = temperatureSetpointShiftStandby
// Simple Field (temperatureSetpointShiftEco)
- temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(16)
+ temperatureSetpointShiftEco, _temperatureSetpointShiftEcoErr := io.ReadFloat32(true, 4, 11)
if _temperatureSetpointShiftEcoErr != nil {
return nil, errors.New("Error parsing 'temperatureSetpointShiftEco' field " + _temperatureSetpointShiftEcoErr.Error())
}
@@ -2900,6 +2905,11 @@ func KnxDatapointSerialize(io *utils.WriteBuffer, value api.PlcValue, formatName
}
case formatName == "F16": // REAL
+ // Reserved Field (Just skip the bytes)
+ if _err := io.WriteUint8(8, uint8(0x0)); _err != nil {
+ return errors.New("Error serializing reserved field " + _err.Error())
+ }
+
// Simple Field (value)
if _err := io.WriteFloat32(16, value.GetFloat32()); _err != nil {
return errors.New("Error serializing 'value' field " + _err.Error())
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go b/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
index e2c4b4f..74e5697 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/DataItem.go
@@ -295,7 +295,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
case dataType == "IEC61131_REAL" && numberOfValues == 1: // REAL
// Simple Field (value)
- value, _valueErr := io.ReadFloat32(32)
+ value, _valueErr := io.ReadFloat32(true, 8, 23)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
@@ -305,7 +305,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
// Array Field (value)
var value []api.PlcValue
for i := 0; i < int(numberOfValues); i++ {
- _item, _itemErr := io.ReadFloat32(32)
+ _item, _itemErr := io.ReadFloat32(true, 8, 23)
if _itemErr != nil {
return nil, errors.New("Error parsing 'value' field " + _itemErr.Error())
}
@@ -315,7 +315,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
case dataType == "IEC61131_LREAL" && numberOfValues == 1: // LREAL
// Simple Field (value)
- value, _valueErr := io.ReadFloat64(64)
+ value, _valueErr := io.ReadFloat64(true, 11, 52)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
@@ -325,7 +325,7 @@ func DataItemParse(io *utils.ReadBuffer, dataType string, numberOfValues uint16)
// Array Field (value)
var value []api.PlcValue
for i := 0; i < int(numberOfValues); i++ {
- _item, _itemErr := io.ReadFloat64(64)
+ _item, _itemErr := io.ReadFloat64(true, 11, 52)
if _itemErr != nil {
return nil, errors.New("Error parsing 'value' field " + _itemErr.Error())
}
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go b/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go
index f283a0e..2cb1ed0 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DataItem.go
@@ -155,7 +155,7 @@ func DataItemParse(io *utils.ReadBuffer, dataProtocolId string, stringLength int
case dataProtocolId == "IEC61131_REAL": // REAL
// Simple Field (value)
- value, _valueErr := io.ReadFloat32(32)
+ value, _valueErr := io.ReadFloat32(true, 8, 23)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
@@ -163,7 +163,7 @@ func DataItemParse(io *utils.ReadBuffer, dataProtocolId string, stringLength int
case dataProtocolId == "IEC61131_LREAL": // LREAL
// Simple Field (value)
- value, _valueErr := io.ReadFloat64(64)
+ value, _valueErr := io.ReadFloat64(true, 11, 52)
if _valueErr != nil {
return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
}
diff --git a/plc4go/internal/plc4go/utils/ReadBuffer.go b/plc4go/internal/plc4go/utils/ReadBuffer.go
index 2268e6f..99413bc 100644
--- a/plc4go/internal/plc4go/utils/ReadBuffer.go
+++ b/plc4go/internal/plc4go/utils/ReadBuffer.go
@@ -19,9 +19,10 @@
package utils
import (
- "bytes"
- "github.com/icza/bitio"
- "math"
+ "bytes"
+ "errors"
+ "github.com/icza/bitio"
+ "math"
)
type ReadBuffer struct {
@@ -137,18 +138,48 @@ func (rb *ReadBuffer) ReadInt64(bitLength uint8) (int64, error) {
return res, nil
}
-func (rb *ReadBuffer) ReadFloat32(bitLength uint8) (float32, error) {
- rb.pos += uint64(bitLength)
- uintValue := uint32(rb.reader.TryReadBits(bitLength))
- res := math.Float32frombits(uintValue)
- if rb.reader.TryError != nil {
- return 0, rb.reader.TryError
- }
- return res, nil
-}
-
-func (rb *ReadBuffer) ReadFloat64(bitLength uint8) (float64, error) {
- rb.pos += uint64(bitLength)
+func (rb *ReadBuffer) ReadFloat32(signed bool, exponentBitLength uint8, mantissaBitLength uint8) (float32, error) {
+ bitLength := exponentBitLength + mantissaBitLength
+ if signed {
+ bitLength++
+ }
+ if signed && exponentBitLength == 8 && mantissaBitLength == 23 {
+ rb.pos += uint64(bitLength)
+ uintValue := uint32(rb.reader.TryReadBits(bitLength))
+ res := math.Float32frombits(uintValue)
+ if rb.reader.TryError != nil {
+ return 0, rb.reader.TryError
+ }
+ return res, nil
+ } else if bitLength < 32 {
+ // TODO: Note ... this is the format as described in the KNX specification
+ sign := true
+ var err error
+ if signed {
+ sign, err = rb.ReadBit()
+ if err != nil {
+ return 0.0, errors.New("error reading sign")
+ }
+ }
+ exp, err := rb.ReadInt32(exponentBitLength)
+ if err != nil {
+ return 0.0, errors.New("error reading exponent")
+ }
+ mantissa, err := rb.ReadUint32(mantissaBitLength)
+ // In the mantissa notation actually the first bit is omitted, we need to add it back
+ f := (0.01 * float64(mantissa)) * math.Pow(float64(2), float64(exp))
+ if sign {
+ return -float32(f), nil
+ }
+ return float32(f), nil
+ } else {
+ return 0.0, errors.New("too many bits for float32")
+ }
+}
+
+func (rb *ReadBuffer) ReadFloat64(signed bool, exponentBitLength uint8, mantissaBitLength uint8) (float64, error) {
+ bitLength := 1 + exponentBitLength + mantissaBitLength
+ rb.pos += uint64(bitLength)
uintValue := rb.reader.TryReadBits(bitLength)
res := math.Float64frombits(uintValue)
if rb.reader.TryError != nil {
diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index b326285..d332ad7 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -437,6 +437,7 @@
['V16' INT]
[simple int 16 'value']
['F16' REAL
+ [reserved uint 8 '0x0']
[simple float 4.11 'value']
]
// TODO Not sure how to encode the day in this