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/03/30 09:57:10 UTC
[plc4x] branch develop updated: plc4go: ads works now with a simple
read + Fixed MultiError as it returned wrong type (TIL (*utils.MultiError =
nil) != nil) + Fixed proper error handling on DriverTestRunner.go
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
The following commit(s) were added to refs/heads/develop by this push:
new d875b78 plc4go: ads works now with a simple read + Fixed MultiError as it returned wrong type (TIL (*utils.MultiError = nil) != nil) + Fixed proper error handling on DriverTestRunner.go
d875b78 is described below
commit d875b7856e354797c1e7fa964e591af0bdc46f7a
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Mar 30 11:56:48 2021 +0200
plc4go: ads works now with a simple read
+ Fixed MultiError as it returned wrong type (TIL (*utils.MultiError = nil) != nil)
+ Fixed proper error handling on DriverTestRunner.go
---
plc4go/cmd/main/drivers/tests/ads_driver_test.go | 10 ++++++--
plc4go/internal/plc4go/ads/Field.go | 12 ++++++---
plc4go/internal/plc4go/ads/FieldHandler.go | 29 +++++++++++-----------
plc4go/internal/plc4go/ads/Reader.go | 4 +--
plc4go/internal/plc4go/ads/Writer.go | 4 +--
plc4go/internal/plc4go/ads/fieldtype_string.go | 8 +++---
plc4go/internal/plc4go/knxnetip/Connection.go | 2 +-
.../interceptors/SingleItemRequestInterceptor.go | 8 +++---
.../plc4go/spi/testutils/DriverTestRunner.go | 9 +++++--
9 files changed, 51 insertions(+), 35 deletions(-)
diff --git a/plc4go/cmd/main/drivers/tests/ads_driver_test.go b/plc4go/cmd/main/drivers/tests/ads_driver_test.go
index d872f10..7e2dca8 100644
--- a/plc4go/cmd/main/drivers/tests/ads_driver_test.go
+++ b/plc4go/cmd/main/drivers/tests/ads_driver_test.go
@@ -26,6 +26,12 @@ import (
)
func TestAdsDriver(t *testing.T) {
- t.Skip("Still a work in progress")
- testutils.RunDriverTestsuite(t, ads.NewDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml")
+ //t.Skip("Still a work in progress")
+ testutils.RunDriverTestsuite(t, ads.NewDriver(), "assets/testing/protocols/ads/DriverTestsuite.xml",
+ // TODO: error in code-generator must be fixed first
+ "Multi-element direct read request",
+ // TODO: symbolic addressing not implemented yet
+ "Single element symbolic read request",
+ "Single element symbolic read request (Address previously resolved)",
+ )
}
diff --git a/plc4go/internal/plc4go/ads/Field.go b/plc4go/internal/plc4go/ads/Field.go
index 21241ec..c79f746 100644
--- a/plc4go/internal/plc4go/ads/Field.go
+++ b/plc4go/internal/plc4go/ads/Field.go
@@ -93,11 +93,15 @@ func (m PlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if err := e.EncodeElement(m.IndexOffset, xml.StartElement{Name: xml.Name{Local: "indexOffset"}}); err != nil {
return err
}
- if err := e.EncodeElement(m.SymbolicAddress, xml.StartElement{Name: xml.Name{Local: "symbolicAddress"}}); err != nil {
- return err
+ if m.SymbolicAddress != "" {
+ if err := e.EncodeElement(m.SymbolicAddress, xml.StartElement{Name: xml.Name{Local: "symbolicAddress"}}); err != nil {
+ return err
+ }
}
- if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}}); err != nil {
- return err
+ if m.StringLength > 0 {
+ if err := e.EncodeElement(m.StringLength, xml.StartElement{Name: xml.Name{Local: "stringLength"}}); err != nil {
+ return err
+ }
}
if err := e.EncodeElement(m.NumberOfElements, xml.StartElement{Name: xml.Name{Local: "numberOfElements"}}); err != nil {
return err
diff --git a/plc4go/internal/plc4go/ads/FieldHandler.go b/plc4go/internal/plc4go/ads/FieldHandler.go
index 14e657e..1825a62 100644
--- a/plc4go/internal/plc4go/ads/FieldHandler.go
+++ b/plc4go/internal/plc4go/ads/FieldHandler.go
@@ -21,7 +21,6 @@ package ads
import (
"encoding/binary"
"encoding/hex"
- "fmt"
model2 "github.com/apache/plc4x/plc4go/internal/plc4go/ads/readwrite/model"
"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
@@ -35,14 +34,14 @@ type FieldType uint8
//go:generate stringer -type FieldType
const (
- StringField FieldType = 0x00
- Field FieldType = 0x01
- SymbolicStringField FieldType = 0x03
- SymbolicField FieldType = 0x04
+ DirectAdsStringField FieldType = 0x00
+ DirectAdsField FieldType = 0x01
+ SymbolicStringField FieldType = 0x03
+ SymbolicField FieldType = 0x04
)
func (i FieldType) GetName() string {
- return fmt.Sprintf("AdsField%s", i.String())
+ return i.String()
}
type FieldHandler struct {
@@ -54,10 +53,10 @@ type FieldHandler struct {
func NewFieldHandler() FieldHandler {
return FieldHandler{
- directAdsStringField: regexp.MustCompile("^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\\d+)):(?P<adsDataType>STRING|WSTRING)\\((?P<stringLength>\\d{1,3})\\)(\\[(?P<numberOfElements>\\d+)])?"),
- directAdsField: regexp.MustCompile("^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\\d+)):(?P<adsDataType>\\w+)(\\[(?P<numberOfElements>\\d+)])?"),
- symbolicAdsStringField: regexp.MustCompile("^(?P<symbolicAddress>.+):(?P<adsDataType>'STRING'|'WSTRING')\\((?P<stringLength>\\d{1,3})\\)(\\[(?P<numberOfElements>\\d+)])?"),
- symbolicAdsField: regexp.MustCompile("^(?P<symbolicAddress>.+):(?P<adsDataType>\\w+)(\\[(?P<numberOfElements>\\d+)])?"),
+ directAdsStringField: regexp.MustCompile(`^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\d+)):(?P<adsDataType>STRING|WSTRING)\((?P<stringLength>\d{1,3})\)(\[(?P<numberOfElements>\d+)])?`),
+ directAdsField: regexp.MustCompile(`^((0[xX](?P<indexGroupHex>[0-9a-fA-F]+))|(?P<indexGroup>\d+))/((0[xX](?P<indexOffsetHex>[0-9a-fA-F]+))|(?P<indexOffset>\d+)):(?P<adsDataType>\w+)(\[(?P<numberOfElements>\d+)])?`),
+ symbolicAdsStringField: regexp.MustCompile(`^(?P<symbolicAddress>.+):(?P<adsDataType>'STRING'|'WSTRING')\((?P<stringLength>\d{1,3})\)(\[(?P<numberOfElements>\d+)])?`),
+ symbolicAdsField: regexp.MustCompile(`^(?P<symbolicAddress>.+):(?P<adsDataType>\w+)(\[(?P<numberOfElements>\d+)])?`),
}
}
@@ -101,7 +100,7 @@ func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
numberOfElements = 1
}
- return NewAdsPlcField(StringField, indexGroup, indexOffset, model2.AdsDataTypeByName(match["datatype"]), int32(stringLength), int64(numberOfElements))
+ return NewAdsPlcField(DirectAdsStringField, indexGroup, indexOffset, model2.AdsDataTypeByName(match["adsDataType"]), int32(stringLength), int64(numberOfElements))
} else if match := utils.GetSubgroupMatches(m.directAdsField, query); match != nil {
var indexGroup uint32
if indexGroupHexString := match["indexGroupHex"]; indexGroupHexString != "" {
@@ -132,13 +131,13 @@ func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
indexOffset = uint32(parsedIndexOffset)
}
- adsDataType := model2.AdsDataTypeByName(match["datatype"])
+ adsDataType := model2.AdsDataTypeByName(match["adsDataType"])
numberOfElements, err := strconv.Atoi(match["numberOfElements"])
if err != nil {
log.Trace().Msg("Falling back to number of elements 1")
numberOfElements = 1
}
- return NewAdsPlcField(Field, indexGroup, indexOffset, adsDataType, int32(0), int64(numberOfElements))
+ return NewAdsPlcField(DirectAdsField, indexGroup, indexOffset, adsDataType, int32(0), int64(numberOfElements))
} else if match := utils.GetSubgroupMatches(m.symbolicAdsStringField, query); match != nil {
stringLength, err := strconv.Atoi(match["stringLength"])
if err != nil {
@@ -148,13 +147,13 @@ func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
if err != nil {
return nil, errors.Wrap(err, "Error decoding number of elements")
}
- return NewAdsSymbolicPlcField(SymbolicStringField, match["symbolicAddress"], model2.AdsDataTypeByName(match["datatype"]), int32(stringLength), int64(numberOfElements))
+ return NewAdsSymbolicPlcField(SymbolicStringField, match["symbolicAddress"], model2.AdsDataTypeByName(match["adsDataType"]), int32(stringLength), int64(numberOfElements))
} else if match := utils.GetSubgroupMatches(m.symbolicAdsStringField, query); match != nil {
numberOfElements, err := strconv.Atoi(match["numberOfElements"])
if err != nil {
return nil, errors.Wrap(err, "Error decoding number of elements")
}
- return NewAdsSymbolicPlcField(SymbolicField, match["symbolicAddress"], model2.AdsDataTypeByName(match["datatype"]), int32(0), int64(numberOfElements))
+ return NewAdsSymbolicPlcField(SymbolicField, match["symbolicAddress"], model2.AdsDataTypeByName(match["adsDataType"]), int32(0), int64(numberOfElements))
} else {
return nil, errors.Errorf("Invalid address format for address '%s'", query)
}
diff --git a/plc4go/internal/plc4go/ads/Reader.go b/plc4go/internal/plc4go/ads/Reader.go
index a3d0dea..e49f492 100644
--- a/plc4go/internal/plc4go/ads/Reader.go
+++ b/plc4go/internal/plc4go/ads/Reader.go
@@ -90,10 +90,10 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
Data: nil,
}
switch adsField.FieldType {
- case StringField:
+ case DirectAdsStringField:
// TODO: what is our read length?
userdata.Data = readWriteModel.NewAdsReadRequest(adsField.IndexGroup, adsField.IndexOffset, 1)
- case Field:
+ case DirectAdsField:
// TODO: what is our read length?
userdata.Data = readWriteModel.NewAdsReadRequest(adsField.IndexGroup, adsField.IndexOffset, 1)
case SymbolicStringField:
diff --git a/plc4go/internal/plc4go/ads/Writer.go b/plc4go/internal/plc4go/ads/Writer.go
index 117a392..a5fd175 100644
--- a/plc4go/internal/plc4go/ads/Writer.go
+++ b/plc4go/internal/plc4go/ads/Writer.go
@@ -102,11 +102,11 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
Data: nil,
}
switch adsField.FieldType {
- case StringField:
+ case DirectAdsStringField:
// TODO: what is our read length?
userdata.Data = readWriteModel.NewAdsWriteRequest(adsField.IndexGroup, adsField.IndexOffset, data)
panic("implement me")
- case Field:
+ case DirectAdsField:
panic("implement me")
case SymbolicStringField:
panic("implement me")
diff --git a/plc4go/internal/plc4go/ads/fieldtype_string.go b/plc4go/internal/plc4go/ads/fieldtype_string.go
index 86d1910..9611a20 100644
--- a/plc4go/internal/plc4go/ads/fieldtype_string.go
+++ b/plc4go/internal/plc4go/ads/fieldtype_string.go
@@ -25,19 +25,19 @@ func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
- _ = x[StringField-0]
- _ = x[Field-1]
+ _ = x[DirectAdsStringField-0]
+ _ = x[DirectAdsField-1]
_ = x[SymbolicStringField-3]
_ = x[SymbolicField-4]
}
const (
- _FieldType_name_0 = "StringFieldField"
+ _FieldType_name_0 = "DirectAdsStringFieldDirectAdsField"
_FieldType_name_1 = "SymbolicStringFieldSymbolicField"
)
var (
- _FieldType_index_0 = [...]uint8{0, 11, 16}
+ _FieldType_index_0 = [...]uint8{0, 20, 34}
_FieldType_index_1 = [...]uint8{0, 19, 32}
)
diff --git a/plc4go/internal/plc4go/knxnetip/Connection.go b/plc4go/internal/plc4go/knxnetip/Connection.go
index 4ad8c56..4d45325 100644
--- a/plc4go/internal/plc4go/knxnetip/Connection.go
+++ b/plc4go/internal/plc4go/knxnetip/Connection.go
@@ -1981,7 +1981,7 @@ func (m *Connection) resetTimeout() {
}
func (m *Connection) resetConnection() {
- fmt.Println("Bad connection detected")
+ log.Warn().Msg("Bad connection detected")
}
func (m *Connection) getGroupAddressNumLevels() uint8 {
diff --git a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
index 0ec0c71..3c6d4be 100644
--- a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
+++ b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
@@ -65,14 +65,16 @@ func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest apiModel.
log.Trace().Msg("Merging requests")
responseCodes := map[string]apiModel.PlcResponseCode{}
val := map[string]values.PlcValue{}
- var err *utils.MultiError = nil
+ var err error = nil
for _, readResult := range readResults {
if readResult.Err != nil {
+ log.Debug().Err(readResult.Err).Msgf("Error during read")
if err == nil {
// Lazy initialization of multi error
- err = &utils.MultiError{MainError: errors.New("while aggregating results"), Errors: []error{readResult.Err}}
+ err = utils.MultiError{MainError: errors.New("while aggregating results"), Errors: []error{readResult.Err}}
} else {
- err.Errors = append(err.Errors, readResult.Err)
+ multiError := err.(utils.MultiError)
+ multiError.Errors = append(multiError.Errors, readResult.Err)
}
} else if readResult.Response != nil {
if len(readResult.Response.GetRequest().GetFieldNames()) > 1 {
diff --git a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
index 2150714..0f75d38 100644
--- a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
@@ -177,6 +177,9 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
}
log.Trace().Msg("Waiting for read request result")
readRequestResult := <-testcase.readRequestResultChannel
+ if readRequestResult.Err != nil {
+ return errors.Wrap(readRequestResult.Err, "error sending response")
+ }
// Serialize the response to XML
actualResponse, err := xml.Marshal(readRequestResult.Response)
if err != nil {
@@ -195,6 +198,9 @@ func (m DriverTestsuite) ExecuteStep(connection plc4go.PlcConnection, testcase *
}
log.Trace().Msg("Waiting for write request result")
writeResponseResult := <-testcase.writeRequestResultChannel
+ if writeResponseResult.Err != nil {
+ return errors.Wrap(writeResponseResult.Err, "error sending response")
+ }
// Serialize the response to XML
actualResponse, err := xml.Marshal(writeResponseResult.Response)
if err != nil {
@@ -442,8 +448,7 @@ func RunDriverTestsuite(t *testing.T, driver plc4go.PlcDriver, testPath string,
return
}
log.Info().Msgf("Running testcase %s", testcase.name)
- err := testsuite.Run(driverManager, testcase)
- if err != nil {
+ if err := testsuite.Run(driverManager, testcase); err != nil {
log.Error().Err(err).Msgf("\n\n-------------------------------------------------------\nFailure\n%+v\n-------------------------------------------------------\n", err)
t.Fail()
}