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 2021/02/09 09:24:31 UTC
[plc4x] branch develop updated: - Fixed a bug not processing
group-addresses, if only one item is returned
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new acc44f3 - Fixed a bug not processing group-addresses, if only one item is returned
acc44f3 is described below
commit acc44f349dfec1f0fd4814338244f7ed35dccb36
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Feb 9 10:24:19 2021 +0100
- Fixed a bug not processing group-addresses, if only one item is returned
---
plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go | 68 ++++++++++++++++------
1 file changed, 49 insertions(+), 19 deletions(-)
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go
index 3d01073..5620222 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go
@@ -25,6 +25,7 @@ import (
"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
"github.com/apache/plc4x/plc4go/internal/plc4go/spi/model"
apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+ "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
"strconv"
"strings"
"time"
@@ -242,8 +243,13 @@ func (b KnxNetIpBrowser) executeCommunicationObjectQuery(field KnxNetIpCommunica
readResult.Response.GetResponseCode("groupAddressTable").GetName())
}
var knxGroupAddresses []*driverModel.KnxGroupAddress
- for _, groupAddress := range readResult.Response.GetValue("groupAddressTable").GetList() {
- groupAddress := Uint16ToKnxGroupAddress(groupAddress.GetUint16(), 3)
+ if readResult.Response.GetValue("groupAddressTable").IsList() {
+ for _, groupAddress := range readResult.Response.GetValue("groupAddressTable").GetList() {
+ groupAddress := Uint16ToKnxGroupAddress(groupAddress.GetUint16(), 3)
+ knxGroupAddresses = append(knxGroupAddresses, groupAddress)
+ }
+ } else {
+ groupAddress := Uint16ToKnxGroupAddress(readResult.Response.GetValue("groupAddressTable").GetUint16(), 3)
knxGroupAddresses = append(knxGroupAddresses, groupAddress)
}
@@ -325,24 +331,19 @@ func (b KnxNetIpBrowser) executeCommunicationObjectQuery(field KnxNetIpCommunica
readResult.Response.GetResponseCode("groupAddressAssociationTable").GetName())
}
// Output the group addresses
- for _, groupAddressAssociation := range readResult.Response.GetValue("groupAddressAssociationTable").GetList() {
- var addressIndex uint16
- var comObjectNumber uint16
- if b.connection.DeviceConnections[*knxAddress].deviceDescriptor == uint16(0x07B0) /* SystemB */ {
- addressIndex = uint16((groupAddressAssociation.GetUint32()>>16)&0xFFFF) - 1
- comObjectNumber = uint16(groupAddressAssociation.GetUint32() & 0xFFFF)
- } else {
- addressIndex = ((groupAddressAssociation.GetUint16() >> 8) & 0xFF) - 1
- comObjectNumber = groupAddressAssociation.GetUint16() & 0xFF
- }
- if addressIndex < uint16(len(knxGroupAddresses)) {
- groupAddress := knxGroupAddresses[addressIndex]
- result := apiModel.PlcBrowseQueryResult{
- Address: fmt.Sprintf(
- "%s#%s %d", knxAddressString, GroupAddressToString(groupAddress), comObjectNumber),
- PossibleDataTypes: nil,
+ if readResult.Response.GetValue("groupAddressAssociationTable").IsList() {
+ for _, groupAddressAssociation := range readResult.Response.GetValue("groupAddressAssociationTable").GetList() {
+ result := b.parseAssociationTable(knxAddressString, b.connection.DeviceConnections[*knxAddress].deviceDescriptor,
+ knxGroupAddresses, groupAddressAssociation)
+ if result != nil {
+ results = append(results, *result)
}
- results = append(results, result)
+ }
+ } else {
+ result := b.parseAssociationTable(knxAddressString, b.connection.DeviceConnections[*knxAddress].deviceDescriptor,
+ knxGroupAddresses, readResult.Response.GetValue("groupAddressAssociationTable"))
+ if result != nil {
+ results = append(results, *result)
}
}
@@ -431,6 +432,35 @@ func (b KnxNetIpBrowser) explodeSegment(segment string, min uint8, max uint8) ([
options = append(options, uint8(option))
}
}
+ } else {
+ value, err := strconv.Atoi(segment)
+ if err != nil {
+ return nil, err
+ }
+ if uint8(value) >= min && uint8(value) <= max {
+ options = append(options, uint8(value))
+ }
}
return options, nil
}
+
+func (m KnxNetIpBrowser) parseAssociationTable(knxAddressString string, deviceDescriptor uint16, knxGroupAddresses []*driverModel.KnxGroupAddress, value values.PlcValue) *apiModel.PlcBrowseQueryResult {
+ var addressIndex uint16
+ var comObjectNumber uint16
+ if deviceDescriptor == uint16(0x07B0) /* SystemB */ {
+ addressIndex = uint16((value.GetUint32()>>16)&0xFFFF) - 1
+ comObjectNumber = uint16(value.GetUint32() & 0xFFFF)
+ } else {
+ addressIndex = ((value.GetUint16() >> 8) & 0xFF) - 1
+ comObjectNumber = value.GetUint16() & 0xFF
+ }
+ if addressIndex < uint16(len(knxGroupAddresses)) {
+ groupAddress := knxGroupAddresses[addressIndex]
+ return &apiModel.PlcBrowseQueryResult{
+ Address: fmt.Sprintf(
+ "%s#%s %d", knxAddressString, GroupAddressToString(groupAddress), comObjectNumber),
+ PossibleDataTypes: nil,
+ }
+ }
+ return nil
+}