You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2021/04/10 18:26:03 UTC

[plc4x] 02/02: plc4go: clean and refactor knx.Browser

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit a635309a897dc140e48d967b83b46a08e32e223c
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Sat Apr 10 20:24:02 2021 +0200

    plc4go: clean and refactor knx.Browser
---
 plc4go/internal/plc4go/knxnetip/Browser.go | 133 +++++++++++++++--------------
 1 file changed, 67 insertions(+), 66 deletions(-)

diff --git a/plc4go/internal/plc4go/knxnetip/Browser.go b/plc4go/internal/plc4go/knxnetip/Browser.go
index c836be8..a12df8e 100644
--- a/plc4go/internal/plc4go/knxnetip/Browser.go
+++ b/plc4go/internal/plc4go/knxnetip/Browser.go
@@ -20,7 +20,6 @@ package knxnetip
 
 import (
 	"encoding/hex"
-	"errors"
 	"fmt"
 	driverModel "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
@@ -28,6 +27,7 @@ import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
 	"strconv"
 	"strings"
@@ -183,15 +183,15 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 	readRequestBuilder.AddQuery("groupAddressTableAddress", knxAddressString+"#1/7")
 	readRequest, err := readRequestBuilder.Build()
 	if err != nil {
-		return nil, errors.New("error creating read request: " + err.Error())
+		return nil, errors.Wrap(err, "error creating read request")
 	}
 	rrr := readRequest.Execute()
 	readResult := <-rrr
 	if readResult.Err != nil {
-		return nil, errors.New("error reading the group address table starting address: " + readResult.Err.Error())
+		return nil, errors.Wrap(readResult.Err, "error reading the group address table starting address:")
 	}
 	if readResult.Response.GetResponseCode("groupAddressTableAddress") != apiModel.PlcResponseCode_OK {
-		return nil, errors.New("error reading group address table starting address: " +
+		return nil, errors.Errorf("error reading group address table starting address: %s",
 			readResult.Response.GetResponseCode("groupAddressTableAddress").GetName())
 	}
 	groupAddressTableStartAddress := readResult.Response.GetValue("groupAddressTableAddress").GetUint32()
@@ -210,15 +210,15 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 	}
 	readRequest, err = readRequestBuilder.Build()
 	if err != nil {
-		return nil, errors.New("error creating read request: " + err.Error())
+		return nil, errors.Wrap(err, "error creating read request")
 	}
 	rrr = readRequest.Execute()
 	readResult = <-rrr
 	if readResult.Err != nil {
-		return nil, errors.New("error reading the number of group address table entries: " + readResult.Err.Error())
+		return nil, errors.Wrap(readResult.Err, "error reading the number of group address table entries")
 	}
 	if readResult.Response.GetResponseCode("numberOfAddressTableEntries") != apiModel.PlcResponseCode_OK {
-		return nil, errors.New("error reading the number of group address table entries: " +
+		return nil, errors.Errorf("error reading the number of group address table entries: %s",
 			readResult.Response.GetResponseCode("numberOfAddressTableEntries").GetName())
 	}
 	numGroupAddresses := readResult.Response.GetValue("numberOfAddressTableEntries").GetUint16()
@@ -241,16 +241,16 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		fmt.Sprintf("%s#%X:UINT[%d]", knxAddressString, groupAddressTableStartAddress, numGroupAddresses))
 	readRequest, err = readRequestBuilder.Build()
 	if err != nil {
-		return nil, errors.New("error creating read request: " + err.Error())
+		return nil, errors.Wrap(err, "error creating read request")
 	}
 	rrr = readRequest.Execute()
 	readResult = <-rrr
 	if readResult.Err != nil {
-		return nil, errors.New("error reading the group address table content: " + readResult.Err.Error())
+		return nil, errors.Wrap(readResult.Err, "error reading the group address table content")
 	}
 	if (readResult.Response == nil) ||
 		(readResult.Response.GetResponseCode("groupAddressTable") != apiModel.PlcResponseCode_OK) {
-		return nil, errors.New("error reading the group address table content: " +
+		return nil, errors.Errorf("error reading the group address table content: %s",
 			readResult.Response.GetResponseCode("groupAddressTable").GetName())
 	}
 	var knxGroupAddresses []*driverModel.KnxGroupAddress
@@ -274,16 +274,16 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		fmt.Sprintf("%s#2/7", knxAddressString))
 	readRequest, err = readRequestBuilder.Build()
 	if err != nil {
-		return nil, errors.New("error creating read request: " + err.Error())
+		return nil, errors.Wrap(err, "error creating read request")
 	}
 	rrr = readRequest.Execute()
 	readResult = <-rrr
 	if readResult.Err != nil {
-		return nil, errors.New("error reading the group address association table address: " + readResult.Err.Error())
+		return nil, errors.Wrap(readResult.Err, "error reading the group address association table address")
 	}
 	if (readResult.Response != nil) &&
 		(readResult.Response.GetResponseCode("groupAddressAssociationTableAddress") != apiModel.PlcResponseCode_OK) {
-		return nil, errors.New("error reading the group address association table address: " +
+		return nil, errors.Errorf("error reading the group address association table address: %s",
 			readResult.Response.GetResponseCode("groupAddressAssociationTableAddress").GetName())
 	}
 	groupAddressAssociationTableAddress := readResult.Response.GetValue("groupAddressAssociationTableAddress").GetUint16()
@@ -300,16 +300,16 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 	}
 	readRequest, err = readRequestBuilder.Build()
 	if err != nil {
-		return nil, errors.New("error creating read request: " + err.Error())
+		return nil, errors.Wrap(err, "error creating read request")
 	}
 	rrr = readRequest.Execute()
 	readResult = <-rrr
 	if readResult.Err != nil {
-		return nil, errors.New("error reading the number of group address association table entries: " + readResult.Err.Error())
+		return nil, errors.Wrap(readResult.Err, "error reading the number of group address association table entries")
 	}
 	if (readResult.Response != nil) &&
 		(readResult.Response.GetResponseCode("numberOfGroupAddressAssociationTableEntries") != apiModel.PlcResponseCode_OK) {
-		return nil, errors.New("error reading the number of group address association table entries: " +
+		return nil, errors.Errorf("error reading the number of group address association table entries: %s",
 			readResult.Response.GetResponseCode("numberOfGroupAddressAssociationTableEntries").GetName())
 	}
 	numberOfGroupAddressAssociationTableEntries := readResult.Response.GetValue("numberOfGroupAddressAssociationTableEntries").GetUint16()
@@ -329,16 +329,16 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 	}
 	readRequest, err = readRequestBuilder.Build()
 	if err != nil {
-		return nil, errors.New("error creating read request: " + err.Error())
+		return nil, errors.Wrap(err, "error creating read request")
 	}
 	rrr = readRequest.Execute()
 	readResult = <-rrr
 	if readResult.Err != nil {
-		return nil, errors.New("error reading the group address association table content: " + readResult.Err.Error())
+		return nil, errors.Wrap(readResult.Err, "error reading the group address association table content")
 	}
 	if (readResult.Response != nil) &&
 		(readResult.Response.GetResponseCode("groupAddressAssociationTable") != apiModel.PlcResponseCode_OK) {
-		return nil, errors.New("error reading the group address association table content: " +
+		return nil, errors.Errorf("error reading the group address association table content: %s",
 			readResult.Response.GetResponseCode("groupAddressAssociationTable").GetName())
 	}
 	// Output the group addresses
@@ -375,54 +375,55 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		}
 		readRequest, err = readRequestBuilder.Build()
 		if err != nil {
-			return nil, errors.New("error creating read request: " + err.Error())
+			return nil, errors.Wrap(err, "error creating read request")
 		}
 		rrr = readRequest.Execute()
 		readResult = <-rrr
 		for groupAddress, comObjectNumber := range groupAddressComObjectNumberMapping {
-			if readResult.Response.GetResponseCode(strconv.Itoa(int(comObjectNumber))) == apiModel.PlcResponseCode_OK {
-				comObjectSettings := readResult.Response.GetValue(strconv.Itoa(int(comObjectNumber))).GetUint16()
-				data := []uint8{uint8((comObjectSettings >> 8) & 0xFF), uint8(comObjectSettings & 0xFF)}
-				rb := utils.NewReadBuffer(data)
-				descriptor, err := driverModel.GroupObjectDescriptorRealisationTypeBParse(rb)
-				if err != nil {
-					log.Info().Err(err).Msg("error parsing com object descriptor")
-					continue
-				}
-
-				// Assemble a PlcBrowseQueryResult
-				var field apiModel.PlcField
-				readable := descriptor.CommunicationEnable && descriptor.ReadEnable
-				writable := descriptor.CommunicationEnable && descriptor.WriteEnable
-				subscribable := descriptor.CommunicationEnable && descriptor.TransmitEnable
-				// Find a matching datatype for the given value-type.
-				fieldType := m.getFieldTypeForValueType(descriptor.ValueType)
-				switch groupAddress.Child.(type) {
-				case *driverModel.KnxGroupAddress3Level:
-					address3Level := driverModel.CastKnxGroupAddress3Level(groupAddress)
-					field = NewGroupAddress3LevelPlcField(strconv.Itoa(int(address3Level.MainGroup)),
-						strconv.Itoa(int(address3Level.MiddleGroup)), strconv.Itoa(int(address3Level.SubGroup)),
-						&fieldType)
-				case *driverModel.KnxGroupAddress2Level:
-					address2Level := driverModel.CastKnxGroupAddress2Level(groupAddress)
-					field = NewGroupAddress2LevelPlcField(strconv.Itoa(int(address2Level.MainGroup)),
-						strconv.Itoa(int(address2Level.SubGroup)),
-						&fieldType)
-				case *driverModel.KnxGroupAddressFreeLevel:
-					address1Level := driverModel.CastKnxGroupAddressFreeLevel(groupAddress)
-					field = NewGroupAddress1LevelPlcField(strconv.Itoa(int(address1Level.SubGroup)),
-						&fieldType)
-				}
+			if readResult.Response.GetResponseCode(strconv.Itoa(int(comObjectNumber))) != apiModel.PlcResponseCode_OK {
+				continue
+			}
+			comObjectSettings := readResult.Response.GetValue(strconv.Itoa(int(comObjectNumber))).GetUint16()
+			data := []uint8{uint8((comObjectSettings >> 8) & 0xFF), uint8(comObjectSettings & 0xFF)}
+			rb := utils.NewReadBuffer(data)
+			descriptor, err := driverModel.GroupObjectDescriptorRealisationTypeBParse(rb)
+			if err != nil {
+				log.Info().Err(err).Msg("error parsing com object descriptor")
+				continue
+			}
 
-				results = append(results, apiModel.PlcBrowseQueryResult{
-					Field:             field,
-					Name:              fmt.Sprintf("#%d", comObjectNumber),
-					Readable:          readable,
-					Writable:          writable,
-					Subscribable:      subscribable,
-					PossibleDataTypes: nil,
-				})
+			// Assemble a PlcBrowseQueryResult
+			var field apiModel.PlcField
+			readable := descriptor.CommunicationEnable && descriptor.ReadEnable
+			writable := descriptor.CommunicationEnable && descriptor.WriteEnable
+			subscribable := descriptor.CommunicationEnable && descriptor.TransmitEnable
+			// Find a matching datatype for the given value-type.
+			fieldType := m.getFieldTypeForValueType(descriptor.ValueType)
+			switch groupAddress.Child.(type) {
+			case *driverModel.KnxGroupAddress3Level:
+				address3Level := driverModel.CastKnxGroupAddress3Level(groupAddress)
+				field = NewGroupAddress3LevelPlcField(strconv.Itoa(int(address3Level.MainGroup)),
+					strconv.Itoa(int(address3Level.MiddleGroup)), strconv.Itoa(int(address3Level.SubGroup)),
+					&fieldType)
+			case *driverModel.KnxGroupAddress2Level:
+				address2Level := driverModel.CastKnxGroupAddress2Level(groupAddress)
+				field = NewGroupAddress2LevelPlcField(strconv.Itoa(int(address2Level.MainGroup)),
+					strconv.Itoa(int(address2Level.SubGroup)),
+					&fieldType)
+			case *driverModel.KnxGroupAddressFreeLevel:
+				address1Level := driverModel.CastKnxGroupAddressFreeLevel(groupAddress)
+				field = NewGroupAddress1LevelPlcField(strconv.Itoa(int(address1Level.SubGroup)),
+					&fieldType)
 			}
+
+			results = append(results, apiModel.PlcBrowseQueryResult{
+				Field:             field,
+				Name:              fmt.Sprintf("#%d", comObjectNumber),
+				Readable:          readable,
+				Writable:          writable,
+				Subscribable:      subscribable,
+				PossibleDataTypes: nil,
+			})
 		}
 	} else if (m.connection.DeviceConnections[*knxAddress].deviceDescriptor & 0xFFF0) == uint16(0x0700) /* System7 */ {
 		// For System 7 Devices we unfortunately can't access the information of where the memory address for the
@@ -435,7 +436,7 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		readRequestBuilder.AddQuery("interfaceProgramVersion", knxAddressString+"#4/13")
 		readRequest, err := readRequestBuilder.Build()
 		if err != nil {
-			return nil, errors.New("error creating read request: " + err.Error())
+			return nil, errors.Wrap(err, "error creating read request")
 		}
 
 		rrr := readRequest.Execute()
@@ -452,7 +453,7 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		// Lookup the com object table address
 		comObjectTableAddresses := driverModel.ComObjectTableAddressesByName("DEV" + strings.ToUpper(applicationId))
 		if comObjectTableAddresses == 0 {
-			return nil, errors.New("error getting com address table address. No table entry for application id: " + applicationId)
+			return nil, errors.Errorf("error getting com address table address. No table entry for application id: %s", applicationId)
 		}
 
 		readRequestBuilder = m.connection.ReadRequestBuilder()
@@ -469,7 +470,7 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		}
 		readRequest, err = readRequestBuilder.Build()
 		if err != nil {
-			return nil, errors.New("error creating read request: " + err.Error())
+			return nil, errors.Wrap(err, "error creating read request")
 		}
 		rrr = readRequest.Execute()
 		readResult = <-rrr
@@ -479,7 +480,7 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 			rb := utils.NewReadBuffer(array)
 			descriptor, err := driverModel.GroupObjectDescriptorRealisationType7Parse(rb)
 			if err != nil {
-				return nil, errors.New("error creating read request: " + err.Error())
+				return nil, errors.Wrap(err, "error creating read request")
 			}
 
 			// We saved the com object number in the field name.
@@ -510,7 +511,7 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
 		readRequestBuilder.AddQuery("comObjectTableAddress", fmt.Sprintf("%s#3/7", knxAddressString))
 		readRequest, err = readRequestBuilder.Build()
 		if err != nil {
-			return nil, errors.New("error creating read request: " + err.Error())
+			return nil, errors.Wrap(err, "error creating read request")
 		}
 		rrr = readRequest.Execute()
 		readResult = <-rrr