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
+}