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 2022/08/08 13:32:49 UTC
[plc4x] branch develop updated (a3d68a2d1 -> e0cc944d4)
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
from a3d68a2d1 feat(plc4xbrowser): added browse support
new ae2667971 chore(plc4xbrowser): adjusted variable name
new e0cc944d4 refactor(plc4go): streamlined plc_browse api
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../discovery/hello_world_plc4go_knx_discovery.go | 8 +-
plc4go/internal/cbus/{Writer.go => Browser.go} | 39 ++++---
plc4go/internal/cbus/Connection.go | 3 +-
plc4go/internal/knxnetip/Browser.go | 43 +++----
plc4go/internal/spi/model/DefaultBrowseRequest.go | 76 ------------
plc4go/internal/spi/model/DefaultPlcBrowseEvent.go | 10 +-
.../spi/model/DefaultPlcBrowseQueryResult.go | 10 +-
.../internal/spi/model/DefaultPlcBrowseRequest.go | 128 +++++++++++++++++++++
.../internal/spi/model/DefaultPlcBrowseResponse.go | 26 ++++-
plc4go/pkg/api/model/plc_browse.go | 40 ++++---
plc4go/pkg/api/model/plc_connection_metadata.go | 2 -
plc4go/pkg/api/model/plc_read.go | 4 +-
plc4go/pkg/api/model/plc_write.go | 4 +-
plc4go/tools/plc4xbrowser/commands.go | 12 +-
14 files changed, 238 insertions(+), 167 deletions(-)
copy plc4go/internal/cbus/{Writer.go => Browser.go} (52%)
delete mode 100644 plc4go/internal/spi/model/DefaultBrowseRequest.go
create mode 100644 plc4go/internal/spi/model/DefaultPlcBrowseRequest.go
[plc4x] 02/02: refactor(plc4go): streamlined plc_browse api
Posted by sr...@apache.org.
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 e0cc944d4e20ae9e510fdd9468c0202856298d37
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Aug 8 15:32:42 2022 +0200
refactor(plc4go): streamlined plc_browse api
---
.../discovery/hello_world_plc4go_knx_discovery.go | 8 +-
plc4go/internal/cbus/Browser.go | 54 +++++++++
plc4go/internal/cbus/Connection.go | 3 +-
plc4go/internal/knxnetip/Browser.go | 43 +++----
plc4go/internal/spi/model/DefaultBrowseRequest.go | 76 ------------
plc4go/internal/spi/model/DefaultPlcBrowseEvent.go | 10 +-
.../spi/model/DefaultPlcBrowseQueryResult.go | 10 +-
.../internal/spi/model/DefaultPlcBrowseRequest.go | 128 +++++++++++++++++++++
.../internal/spi/model/DefaultPlcBrowseResponse.go | 26 ++++-
plc4go/pkg/api/model/plc_browse.go | 40 ++++---
plc4go/pkg/api/model/plc_connection_metadata.go | 2 -
plc4go/pkg/api/model/plc_read.go | 4 +-
plc4go/pkg/api/model/plc_write.go | 4 +-
plc4go/tools/plc4xbrowser/commands.go | 2 +-
14 files changed, 267 insertions(+), 143 deletions(-)
diff --git a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
index 79bbe4198..5febd5785 100644
--- a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
+++ b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
@@ -70,9 +70,9 @@ func main() {
// Try to find all KNX devices on the current network
browseRequest, err := connection.BrowseRequestBuilder().
- AddItem("allDevices", "[1-15].[1-15].[0-255]").
- //AddItem("allMyDevices", "[1-3].[1-6].[0-60]").
- //AddItem("onlyOneDevice", "1.1.20")
+ AddQuery("allDevices", "[1-15].[1-15].[0-255]").
+ //AddQuery("allMyDevices", "[1-3].[1-6].[0-60]").
+ //AddQuery("onlyOneDevice", "1.1.20")
Build()
if err != nil {
log.Error().Err(err).Msg("error creating browse request")
@@ -85,7 +85,7 @@ func main() {
// Try to get all the com-objects and the group addresses they are attached to.
browseRequest, err := connection.BrowseRequestBuilder().
- AddItem("comObjects", knxAddress+"#com-obj").
+ AddQuery("comObjects", knxAddress+"#com-obj").
Build()
if err != nil {
log.Error().Err(err).Msg("error creating read request")
diff --git a/plc4go/internal/cbus/Browser.go b/plc4go/internal/cbus/Browser.go
new file mode 100644
index 000000000..39c5ccbe0
--- /dev/null
+++ b/plc4go/internal/cbus/Browser.go
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package cbus
+
+import (
+ "github.com/apache/plc4x/plc4go/internal/spi"
+ apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
+)
+
+type Browser struct {
+ connection *Connection
+ messageCodec spi.MessageCodec
+ sequenceCounter uint8
+}
+
+func NewBrowser(connection *Connection, messageCodec spi.MessageCodec) *Browser {
+ return &Browser{
+ connection: connection,
+ messageCodec: messageCodec,
+ sequenceCounter: 0,
+ }
+}
+
+func (m Browser) Browse(browseRequest apiModel.PlcBrowseRequest) <-chan apiModel.PlcBrowseRequestResult {
+ return m.BrowseWithInterceptor(browseRequest, func(result apiModel.PlcBrowseEvent) bool {
+ return true
+ })
+}
+
+func (m Browser) BrowseWithInterceptor(browseRequest apiModel.PlcBrowseRequest, interceptor func(result apiModel.PlcBrowseEvent) bool) <-chan apiModel.PlcBrowseRequestResult {
+ result := make(chan apiModel.PlcBrowseRequestResult)
+
+ go func() {
+ // TODO: implement me
+ }()
+ return result
+}
diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index e45928470..f5dd9895f 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -157,8 +157,7 @@ func (c *Connection) UnsubscriptionRequestBuilder() apiModel.PlcUnsubscriptionRe
}
func (c *Connection) BrowseRequestBuilder() apiModel.PlcBrowseRequestBuilder {
- // TODO: where do we get the browser from
- return internalModel.NewDefaultPlcBrowseRequestBuilder(nil)
+ return internalModel.NewDefaultPlcBrowseRequestBuilder(NewBrowser(c, c.messageCodec))
}
func (c *Connection) addSubscriber(subscriber *Subscriber) {
diff --git a/plc4go/internal/knxnetip/Browser.go b/plc4go/internal/knxnetip/Browser.go
index a782ed1f4..247ca225b 100644
--- a/plc4go/internal/knxnetip/Browser.go
+++ b/plc4go/internal/knxnetip/Browser.go
@@ -67,43 +67,38 @@ func (m Browser) BrowseWithInterceptor(browseRequest apiModel.PlcBrowseRequest,
}
go func() {
- results := map[string][]apiModel.PlcBrowseQueryResult{}
- for _, queryName := range browseRequest.GetQueryNames() {
- queryString := browseRequest.GetQueryString(queryName)
- field, err := m.connection.fieldHandler.ParseQuery(queryString)
- if err != nil {
- sendResult(nil, err)
- return
- }
+ responseCodes := map[string]apiModel.PlcResponseCode{}
+ results := map[string][]apiModel.PlcBrowseFoundField{}
+ for _, fieldName := range browseRequest.GetFieldNames() {
+ field := browseRequest.GetField(fieldName)
switch field.(type) {
case DeviceQueryField:
- queryResults, err := m.executeDeviceQuery(field.(DeviceQueryField), browseRequest, queryName, interceptor)
+ queryResults, err := m.executeDeviceQuery(field.(DeviceQueryField), browseRequest, fieldName, interceptor)
if err != nil {
- // TODO: Return some sort of return code like with the read and write APIs
- results[queryName] = nil
+ log.Warn().Err(err).Msg("Error executing device query")
+ responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
} else {
- results[queryName] = queryResults
+ results[fieldName] = queryResults
}
case CommunicationObjectQueryField:
queryResults, err := m.executeCommunicationObjectQuery(field.(CommunicationObjectQueryField))
if err != nil {
- // TODO: Return some sort of return code like with the read and write APIs
- results[queryName] = nil
+ log.Warn().Err(err).Msg("Error executing device query")
+ responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
} else {
- results[queryName] = queryResults
+ results[fieldName] = queryResults
}
default:
- // TODO: Return some sort of return code like with the read and write APIs
- results[queryName] = nil
+ responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
}
}
- sendResult(model.NewDefaultPlcBrowseResponse(browseRequest, results), nil)
+ sendResult(model.NewDefaultPlcBrowseResponse(browseRequest, results, responseCodes), nil)
}()
return result
}
-func (m Browser) executeDeviceQuery(field DeviceQueryField, browseRequest apiModel.PlcBrowseRequest, queryName string, interceptor func(result apiModel.PlcBrowseEvent) bool) ([]apiModel.PlcBrowseQueryResult, error) {
+func (m Browser) executeDeviceQuery(field DeviceQueryField, browseRequest apiModel.PlcBrowseRequest, fieldName string, interceptor func(result apiModel.PlcBrowseEvent) bool) ([]apiModel.PlcBrowseFoundField, error) {
// Create a list of address strings, which doesn't contain any ranges, lists or wildcards
knxAddresses, err := m.calculateAddresses(field)
if err != nil {
@@ -113,7 +108,7 @@ func (m Browser) executeDeviceQuery(field DeviceQueryField, browseRequest apiMod
return nil, errors.New("query resulted in not a single valid address")
}
- var queryResults []apiModel.PlcBrowseQueryResult
+ var queryResults []apiModel.PlcBrowseFoundField
// Parse each of these expanded addresses and handle them accordingly.
for _, knxAddress := range knxAddresses {
// Send a connection request to the device
@@ -141,7 +136,7 @@ func (m Browser) executeDeviceQuery(field DeviceQueryField, browseRequest apiMod
if interceptor != nil {
add = interceptor(&model.DefaultPlcBrowseEvent{
Request: browseRequest,
- QueryName: queryName,
+ FieldName: fieldName,
Result: queryResult,
Err: nil,
})
@@ -174,8 +169,8 @@ func (m Browser) executeDeviceQuery(field DeviceQueryField, browseRequest apiMod
return queryResults, nil
}
-func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryField) ([]apiModel.PlcBrowseQueryResult, error) {
- var results []apiModel.PlcBrowseQueryResult
+func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryField) ([]apiModel.PlcBrowseFoundField, error) {
+ var results []apiModel.PlcBrowseFoundField
knxAddress := field.toKnxAddress()
knxAddressString := KnxAddressToString(knxAddress)
@@ -404,7 +399,7 @@ func (m Browser) executeCommunicationObjectQuery(field CommunicationObjectQueryF
continue
}
- // Assemble a PlcBrowseQueryResult
+ // Assemble a PlcBrowseFoundField
var field apiModel.PlcField
communicationEnable := descriptor.GetCommunicationEnable()
readable := communicationEnable && descriptor.GetReadEnable()
diff --git a/plc4go/internal/spi/model/DefaultBrowseRequest.go b/plc4go/internal/spi/model/DefaultBrowseRequest.go
deleted file mode 100644
index 5bf3c0ee5..000000000
--- a/plc4go/internal/spi/model/DefaultBrowseRequest.go
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package model
-
-import (
- "github.com/apache/plc4x/plc4go/internal/spi"
- "github.com/apache/plc4x/plc4go/pkg/api/model"
-)
-
-type DefaultPlcBrowseRequestBuilder struct {
- browser spi.PlcBrowser
- queries map[string]string
-}
-
-func NewDefaultPlcBrowseRequestBuilder(browser spi.PlcBrowser) *DefaultPlcBrowseRequestBuilder {
- return &DefaultPlcBrowseRequestBuilder{
- browser: browser,
- queries: map[string]string{},
- }
-}
-
-func (m *DefaultPlcBrowseRequestBuilder) AddItem(name string, query string) model.PlcBrowseRequestBuilder {
- m.queries[name] = query
- return m
-}
-
-func (m *DefaultPlcBrowseRequestBuilder) Build() (model.PlcBrowseRequest, error) {
- queries := m.queries
- return DefaultPlcBrowseRequest{
- queries: queries,
- browser: m.browser,
- }, nil
-}
-
-type DefaultPlcBrowseRequest struct {
- DefaultRequest
- queries map[string]string
- browser spi.PlcBrowser
-}
-
-func (d DefaultPlcBrowseRequest) GetQueryNames() []string {
- var queryNames []string
- for queryName := range d.queries {
- queryNames = append(queryNames, queryName)
- }
- return queryNames
-}
-
-func (d DefaultPlcBrowseRequest) GetQueryString(name string) string {
- return d.queries[name]
-}
-
-func (d DefaultPlcBrowseRequest) Execute() <-chan model.PlcBrowseRequestResult {
- return d.browser.Browse(d)
-}
-
-func (d DefaultPlcBrowseRequest) ExecuteWithInterceptor(interceptor func(result model.PlcBrowseEvent) bool) <-chan model.PlcBrowseRequestResult {
- return d.browser.BrowseWithInterceptor(d, interceptor)
-}
diff --git a/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go b/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
index 1f276eb7e..004ed32df 100644
--- a/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
+++ b/plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
@@ -23,8 +23,8 @@ import "github.com/apache/plc4x/plc4go/pkg/api/model"
type DefaultPlcBrowseEvent struct {
Request model.PlcBrowseRequest
- QueryName string
- Result model.PlcBrowseQueryResult
+ FieldName string
+ Result model.PlcBrowseFoundField
Err error
}
@@ -32,11 +32,11 @@ func (d *DefaultPlcBrowseEvent) GetRequest() model.PlcBrowseRequest {
return d.Request
}
-func (d *DefaultPlcBrowseEvent) GetQueryName() string {
- return d.QueryName
+func (d *DefaultPlcBrowseEvent) GetFieldName() string {
+ return d.FieldName
}
-func (d *DefaultPlcBrowseEvent) GetResult() model.PlcBrowseQueryResult {
+func (d *DefaultPlcBrowseEvent) GetResult() model.PlcBrowseFoundField {
return d.Result
}
diff --git a/plc4go/internal/spi/model/DefaultPlcBrowseQueryResult.go b/plc4go/internal/spi/model/DefaultPlcBrowseQueryResult.go
index 9fb7dab46..8888eb868 100644
--- a/plc4go/internal/spi/model/DefaultPlcBrowseQueryResult.go
+++ b/plc4go/internal/spi/model/DefaultPlcBrowseQueryResult.go
@@ -19,7 +19,10 @@
package model
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+ "github.com/apache/plc4x/plc4go/pkg/api/model"
+ "github.com/apache/plc4x/plc4go/pkg/api/values"
+)
type DefaultPlcBrowseQueryResult struct {
Field model.PlcField
@@ -28,6 +31,7 @@ type DefaultPlcBrowseQueryResult struct {
Writable bool
Subscribable bool
PossibleDataTypes []string
+ Attributes map[string]values.PlcValue
}
func (d *DefaultPlcBrowseQueryResult) GetField() model.PlcField {
@@ -53,3 +57,7 @@ func (d *DefaultPlcBrowseQueryResult) IsSubscribable() bool {
func (d *DefaultPlcBrowseQueryResult) GetPossibleDataTypes() []string {
return d.PossibleDataTypes
}
+
+func (d *DefaultPlcBrowseQueryResult) GetAttributes() map[string]values.PlcValue {
+ return d.Attributes
+}
diff --git a/plc4go/internal/spi/model/DefaultPlcBrowseRequest.go b/plc4go/internal/spi/model/DefaultPlcBrowseRequest.go
new file mode 100644
index 000000000..06cb5bc94
--- /dev/null
+++ b/plc4go/internal/spi/model/DefaultPlcBrowseRequest.go
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+ "github.com/apache/plc4x/plc4go/internal/spi"
+ "github.com/apache/plc4x/plc4go/internal/spi/utils"
+ "github.com/apache/plc4x/plc4go/pkg/api/model"
+ "github.com/pkg/errors"
+)
+
+type DefaultPlcBrowseRequestBuilder struct {
+ fieldHandler spi.PlcFieldHandler
+ browser spi.PlcBrowser
+ queries map[string]string
+ queryNames []string
+ fields map[string]model.PlcField
+ fieldNames []string
+}
+
+func NewDefaultPlcBrowseRequestBuilder(browser spi.PlcBrowser) *DefaultPlcBrowseRequestBuilder {
+ return &DefaultPlcBrowseRequestBuilder{
+ browser: browser,
+ queries: map[string]string{},
+ }
+}
+
+func (d *DefaultPlcBrowseRequestBuilder) AddQuery(name string, query string) model.PlcBrowseRequestBuilder {
+ d.queryNames = append(d.queryNames, name)
+ d.queries[name] = query
+ return d
+}
+
+func (d *DefaultPlcBrowseRequestBuilder) AddField(name string, field model.PlcField) model.PlcBrowseRequestBuilder {
+ d.fieldNames = append(d.fieldNames, name)
+ d.fields[name] = field
+ return d
+}
+
+func (d *DefaultPlcBrowseRequestBuilder) Build() (model.PlcBrowseRequest, error) {
+ for _, name := range d.queryNames {
+ query := d.queries[name]
+ field, err := d.fieldHandler.ParseQuery(query)
+ if err != nil {
+ return nil, errors.Wrapf(err, "Error parsing query: %s", query)
+ }
+ d.AddField(name, field)
+ }
+ return NewDefaultPlcBrowseRequest(d.fields, d.fieldNames, d.browser), nil
+}
+
+type DefaultPlcBrowseRequest struct {
+ DefaultRequest
+ browser spi.PlcBrowser
+}
+
+func NewDefaultPlcBrowseRequest(fields map[string]model.PlcField, fieldNames []string, browser spi.PlcBrowser) model.PlcBrowseRequest {
+ return DefaultPlcBrowseRequest{
+ DefaultRequest: NewDefaultRequest(fields, fieldNames),
+ browser: browser,
+ }
+}
+
+func (d DefaultPlcBrowseRequest) Execute() <-chan model.PlcBrowseRequestResult {
+ return d.browser.Browse(d)
+}
+
+func (d DefaultPlcBrowseRequest) ExecuteWithInterceptor(interceptor func(result model.PlcBrowseEvent) bool) <-chan model.PlcBrowseRequestResult {
+ return d.browser.BrowseWithInterceptor(d, interceptor)
+}
+
+func (d DefaultPlcBrowseRequest) Serialize(writeBuffer utils.WriteBuffer) error {
+ if err := writeBuffer.PushContext("PlcBrowseRequest"); err != nil {
+ return err
+ }
+
+ if err := writeBuffer.PushContext("fields"); err != nil {
+ return err
+ }
+ for _, fieldName := range d.GetFieldNames() {
+ if err := writeBuffer.PushContext(fieldName); err != nil {
+ return err
+ }
+ field := d.GetField(fieldName)
+ if serializableField, ok := field.(utils.Serializable); ok {
+ if err := serializableField.Serialize(writeBuffer); err != nil {
+ return err
+ }
+ } else {
+ return errors.Errorf("Error serializing. Field %T doesn't implement Serializable", field)
+ }
+ if err := writeBuffer.PopContext(fieldName); err != nil {
+ return err
+ }
+ }
+ if err := writeBuffer.PopContext("fields"); err != nil {
+ return err
+ }
+ if err := writeBuffer.PopContext("PlcBrowseRequest"); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (d DefaultPlcBrowseRequest) String() string {
+ writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+ if err := writeBuffer.WriteSerializable(d); err != nil {
+ return err.Error()
+ }
+ return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/internal/spi/model/DefaultPlcBrowseResponse.go b/plc4go/internal/spi/model/DefaultPlcBrowseResponse.go
index 26c31b0c6..4bc37e2b3 100644
--- a/plc4go/internal/spi/model/DefaultPlcBrowseResponse.go
+++ b/plc4go/internal/spi/model/DefaultPlcBrowseResponse.go
@@ -19,21 +19,35 @@
package model
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+ "github.com/apache/plc4x/plc4go/pkg/api/model"
+)
type DefaultPlcBrowseResponse struct {
DefaultResponse
request model.PlcBrowseRequest
- results map[string][]model.PlcBrowseQueryResult
+ results map[string][]model.PlcBrowseFoundField
}
-func NewDefaultPlcBrowseResponse(request model.PlcBrowseRequest, results map[string][]model.PlcBrowseQueryResult) DefaultPlcBrowseResponse {
+func NewDefaultPlcBrowseResponse(request model.PlcBrowseRequest, results map[string][]model.PlcBrowseFoundField, responseCodes map[string]model.PlcResponseCode) DefaultPlcBrowseResponse {
return DefaultPlcBrowseResponse{
- request: request,
- results: results,
+ DefaultResponse: DefaultResponse{responseCodes: responseCodes},
+ request: request,
+ results: results,
}
}
+func (d DefaultPlcBrowseResponse) GetFieldNames() []string {
+ var fieldNames []string
+ // We take the field names from the request to keep order as map is not ordered
+ for _, name := range d.request.GetFieldNames() {
+ if _, ok := d.results[name]; ok {
+ fieldNames = append(fieldNames, name)
+ }
+ }
+ return fieldNames
+}
+
func (d DefaultPlcBrowseResponse) GetRequest() model.PlcBrowseRequest {
return d.request
}
@@ -46,6 +60,6 @@ func (d DefaultPlcBrowseResponse) GetQueryNames() []string {
return queryNames
}
-func (d DefaultPlcBrowseResponse) GetQueryResults(queryName string) []model.PlcBrowseQueryResult {
+func (d DefaultPlcBrowseResponse) GetQueryResults(queryName string) []model.PlcBrowseFoundField {
return d.results[queryName]
}
diff --git a/plc4go/pkg/api/model/plc_browse.go b/plc4go/pkg/api/model/plc_browse.go
index 3f008bde2..762ba8e9b 100644
--- a/plc4go/pkg/api/model/plc_browse.go
+++ b/plc4go/pkg/api/model/plc_browse.go
@@ -19,35 +19,29 @@
package model
+import "github.com/apache/plc4x/plc4go/pkg/api/values"
+
type PlcBrowseRequestBuilder interface {
- AddItem(name string, query string) PlcBrowseRequestBuilder
+ AddQuery(name string, query string) PlcBrowseRequestBuilder
Build() (PlcBrowseRequest, error)
}
-type PlcBrowseQueryResult interface {
- GetField() PlcField
- GetName() string
- IsReadable() bool
- IsWritable() bool
- IsSubscribable() bool
- GetPossibleDataTypes() []string
-}
-
type PlcBrowseRequest interface {
+ PlcRequest
// Execute Will not return until a potential scan is finished and will return all results in one block
Execute() <-chan PlcBrowseRequestResult
// ExecuteWithInterceptor Will call the given callback for every found resource
ExecuteWithInterceptor(interceptor func(result PlcBrowseEvent) bool) <-chan PlcBrowseRequestResult
- GetQueryNames() []string
- GetQueryString(name string) string
- PlcRequest
+ GetFieldNames() []string
+ GetField(name string) PlcField
}
type PlcBrowseResponse interface {
- GetRequest() PlcBrowseRequest
- GetQueryNames() []string
- GetQueryResults(name string) []PlcBrowseQueryResult
PlcResponse
+ GetRequest() PlcBrowseRequest
+ GetFieldNames() []string
+ GetResponseCode(name string) PlcResponseCode
+ GetQueryResults(name string) []PlcBrowseFoundField
}
type PlcBrowseRequestResult interface {
@@ -58,7 +52,17 @@ type PlcBrowseRequestResult interface {
type PlcBrowseEvent interface {
GetRequest() PlcBrowseRequest
- GetQueryName() string
- GetResult() PlcBrowseQueryResult
+ GetFieldName() string
+ GetResult() PlcBrowseFoundField
GetErr() error
}
+
+type PlcBrowseFoundField interface {
+ GetField() PlcField
+ GetName() string
+ IsReadable() bool
+ IsWritable() bool
+ IsSubscribable() bool
+ GetPossibleDataTypes() []string
+ GetAttributes() map[string]values.PlcValue
+}
diff --git a/plc4go/pkg/api/model/plc_connection_metadata.go b/plc4go/pkg/api/model/plc_connection_metadata.go
index 4712ca857..905d2e92f 100644
--- a/plc4go/pkg/api/model/plc_connection_metadata.go
+++ b/plc4go/pkg/api/model/plc_connection_metadata.go
@@ -22,10 +22,8 @@ package model
// PlcConnectionMetadata Information about connection capabilities.
// This includes connection and driver specific metadata.
type PlcConnectionMetadata interface {
-
// GetConnectionAttributes Gives access to a map of additional information the driver might be able to provide.
GetConnectionAttributes() map[string]string
-
// CanRead Indicates that the connection supports reading.
CanRead() bool
// CanWrite Indicates that the connection supports writing.
diff --git a/plc4go/pkg/api/model/plc_read.go b/plc4go/pkg/api/model/plc_read.go
index b27f77b81..7dd6f9fc3 100644
--- a/plc4go/pkg/api/model/plc_read.go
+++ b/plc4go/pkg/api/model/plc_read.go
@@ -34,16 +34,16 @@ type PlcReadRequestResult interface {
}
type PlcReadRequest interface {
+ PlcRequest
Execute() <-chan PlcReadRequestResult
GetFieldNames() []string
GetField(name string) PlcField
- PlcRequest
}
type PlcReadResponse interface {
+ PlcResponse
GetRequest() PlcReadRequest
GetFieldNames() []string
GetResponseCode(name string) PlcResponseCode
GetValue(name string) values.PlcValue
- PlcResponse
}
diff --git a/plc4go/pkg/api/model/plc_write.go b/plc4go/pkg/api/model/plc_write.go
index 3df89507d..d78d2d0ff 100644
--- a/plc4go/pkg/api/model/plc_write.go
+++ b/plc4go/pkg/api/model/plc_write.go
@@ -34,16 +34,16 @@ type PlcWriteRequestResult interface {
}
type PlcWriteRequest interface {
+ PlcRequest
Execute() <-chan PlcWriteRequestResult
GetFieldNames() []string
GetField(name string) PlcField
GetValue(name string) values.PlcValue
- PlcRequest
}
type PlcWriteResponse interface {
+ PlcResponse
GetRequest() PlcWriteRequest
GetFieldNames() []string
GetResponseCode(name string) PlcResponseCode
- PlcResponse
}
diff --git a/plc4go/tools/plc4xbrowser/commands.go b/plc4go/tools/plc4xbrowser/commands.go
index 3be7676e5..0241a659d 100644
--- a/plc4go/tools/plc4xbrowser/commands.go
+++ b/plc4go/tools/plc4xbrowser/commands.go
@@ -264,7 +264,7 @@ var rootCommand = Command{
} else {
start := time.Now()
browseRequest, err := connection.BrowseRequestBuilder().
- AddItem("writeField", split[1]).
+ AddQuery("writeField", split[1]).
Build()
if err != nil {
return errors.Wrapf(err, "%s can't browse", connectionsString)
[plc4x] 01/02: chore(plc4xbrowser): adjusted variable name
Posted by sr...@apache.org.
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 ae2667971d30d94965cb3d4922542a6863a89114
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Aug 8 12:46:31 2022 +0200
chore(plc4xbrowser): adjusted variable name
---
plc4go/tools/plc4xbrowser/commands.go | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/plc4go/tools/plc4xbrowser/commands.go b/plc4go/tools/plc4xbrowser/commands.go
index fef5f58a8..3be7676e5 100644
--- a/plc4go/tools/plc4xbrowser/commands.go
+++ b/plc4go/tools/plc4xbrowser/commands.go
@@ -263,22 +263,22 @@ var rootCommand = Command{
return errors.Errorf("%s not connected", connectionsString)
} else {
start := time.Now()
- writeRequest, err := connection.BrowseRequestBuilder().
+ browseRequest, err := connection.BrowseRequestBuilder().
AddItem("writeField", split[1]).
Build()
if err != nil {
return errors.Wrapf(err, "%s can't browse", connectionsString)
}
- writeRequestResult := <-writeRequest.Execute()
- if err := writeRequestResult.GetErr(); err != nil {
+ browseRequestResult := <-browseRequest.Execute()
+ if err := browseRequestResult.GetErr(); err != nil {
return errors.Wrapf(err, "%s can't browse", connectionsString)
}
plc4xBrowserLog.Debug().Msgf("write took %f seconds", time.Now().Sub(start).Seconds())
- if err := writeRequestResult.GetErr(); err != nil {
+ if err := browseRequestResult.GetErr(); err != nil {
return errors.Wrapf(err, "%s error browse", connectionsString)
}
numberOfMessagesReceived++
- messageReceived(numberOfMessagesReceived, time.Now(), writeRequestResult.GetResponse())
+ messageReceived(numberOfMessagesReceived, time.Now(), browseRequestResult.GetResponse())
}
return nil
},