Skip to content

Commit

Permalink
feat(plc4go/cbus): added interceptor to browser
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Aug 10, 2022
1 parent 21b3d63 commit 78cd30b
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 33 deletions.
22 changes: 19 additions & 3 deletions plc4go/internal/cbus/Browser.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,21 +111,37 @@ func (m Browser) BrowseWithInterceptor(browseRequest apiModel.PlcBrowseRequest,
}
continue unitLoop
}
queryResults = append(queryResults, &model.DefaultPlcBrowseQueryResult{
response := requestResult.GetResponse()
if code := response.GetResponseCode(readFieldName); code != apiModel.PlcResponseCode_OK {
event.Msgf("unit %d: error reading field %s. Code %s", unitAddress, attribute, code)
continue unitLoop
}
queryResult := &model.DefaultPlcBrowseQueryResult{
Field: NewCALIdentifyField(unit, attribute, 1),
Name: fieldName,
Readable: true,
Writable: false,
Subscribable: false,
Attributes: map[string]values.PlcValue{
"CurrentValue": requestResult.GetResponse().GetValue(readFieldName),
"CurrentValue": response.GetValue(readFieldName),
},
})
}
if interceptor != nil {
interceptor(&model.DefaultPlcBrowseEvent{
Request: browseRequest,
FieldName: readFieldName,
Result: queryResult,
Err: nil,
})
}
queryResults = append(queryResults, queryResult)
}
}
responseCodes[fieldName] = apiModel.PlcResponseCode_OK
default:
responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
}
results[fieldName] = queryResults
}
result <- &model.DefaultPlcBrowseRequestResult{
Request: browseRequest,
Expand Down
96 changes: 76 additions & 20 deletions plc4go/internal/cbus/Field.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,57 +281,73 @@ func (m statusField) Serialize(writeBuffer utils.WriteBuffer) error {
return nil
}

func (m calField) GetUnitAddress() readWriteModel.UnitAddress {
return m.unitAddress
func (c calField) GetUnitAddress() readWriteModel.UnitAddress {
return c.unitAddress
}

func (m calField) Serialize(writeBuffer utils.WriteBuffer) error {
return m.unitAddress.Serialize(writeBuffer)
func (c calField) Serialize(writeBuffer utils.WriteBuffer) error {
return c.unitAddress.Serialize(writeBuffer)
}

func (m calRecallField) GetParameter() readWriteModel.Parameter {
return m.parameter
func (c calField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(c); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}

func (m calRecallField) GetCount() uint8 {
return m.count
func (c calRecallField) GetParameter() readWriteModel.Parameter {
return c.parameter
}

func (m calRecallField) GetAddressString() string {
return fmt.Sprintf("%d[%d]", m.fieldType, m.numElements)
func (c calRecallField) GetCount() uint8 {
return c.count
}

func (m calRecallField) GetTypeName() string {
return m.fieldType.GetName()
func (c calRecallField) GetAddressString() string {
return fmt.Sprintf("%d[%d]", c.fieldType, c.numElements)
}

func (m calRecallField) GetQuantity() uint16 {
return m.numElements
func (c calRecallField) GetTypeName() string {
return c.fieldType.GetName()
}

func (m calRecallField) Serialize(writeBuffer utils.WriteBuffer) error {
if err := writeBuffer.PushContext(m.fieldType.GetName()); err != nil {
func (c calRecallField) GetQuantity() uint16 {
return c.numElements
}

func (c calRecallField) Serialize(writeBuffer utils.WriteBuffer) error {
if err := writeBuffer.PushContext(c.fieldType.GetName()); err != nil {
return err
}

if err := m.calField.Serialize(writeBuffer); err != nil {
if err := c.calField.Serialize(writeBuffer); err != nil {
return err
}

if err := m.parameter.Serialize(writeBuffer); err != nil {
if err := c.parameter.Serialize(writeBuffer); err != nil {
return err
}

if err := writeBuffer.WriteUint8("count", 8, m.count); err != nil {
if err := writeBuffer.WriteUint8("count", 8, c.count); err != nil {
return err
}

if err := writeBuffer.PopContext(m.fieldType.GetName()); err != nil {
if err := writeBuffer.PopContext(c.fieldType.GetName()); err != nil {
return err
}
return nil
}

func (c calRecallField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(c); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}

func (c calIdentifyField) GetAttribute() readWriteModel.Attribute {
return c.attribute
}
Expand Down Expand Up @@ -367,6 +383,14 @@ func (c calIdentifyField) Serialize(writeBuffer utils.WriteBuffer) error {
return nil
}

func (c calIdentifyField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(c); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}

func (c calGetstatusField) GetParameter() readWriteModel.Parameter {
return c.parameter
}
Expand Down Expand Up @@ -410,6 +434,14 @@ func (c calGetstatusField) Serialize(writeBuffer utils.WriteBuffer) error {
return nil
}

func (c calGetstatusField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(c); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}

func (s salMonitorField) GetAddressString() string {
return fmt.Sprintf("%d/%s%s[%d]", s.fieldType, s.unitAddress, s.application, s.numElements)
}
Expand Down Expand Up @@ -448,6 +480,14 @@ func (s salMonitorField) Serialize(writeBuffer utils.WriteBuffer) error {
return nil
}

func (s salMonitorField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(s); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}

func (m mmiMonitorField) GetAddressString() string {
return fmt.Sprintf("%d/%s%s[%d]", m.fieldType, m.unitAddress, m.application, m.numElements)
}
Expand Down Expand Up @@ -486,6 +526,14 @@ func (m mmiMonitorField) Serialize(writeBuffer utils.WriteBuffer) error {
return nil
}

func (m mmiMonitorField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(m); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}

func (u unitInfoField) GetUnitAddress() *readWriteModel.UnitAddress {
return u.unitAddress
}
Expand Down Expand Up @@ -528,3 +576,11 @@ func (u unitInfoField) Serialize(writeBuffer utils.WriteBuffer) error {
}
return nil
}

func (u unitInfoField) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(u); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}
2 changes: 1 addition & 1 deletion plc4go/internal/cbus/Reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
cbusMessage := receivedMessage.(readWriteModel.CBusMessage)
messageToClient := cbusMessage.(readWriteModel.CBusMessageToClient)
if _, ok := messageToClient.GetReply().(readWriteModel.ServerErrorReplyExactly); ok {
log.Debug().Msg("We got a server failure")
log.Trace().Msg("We got a server failure")
addResponseCode(fieldNameCopy, model.PlcResponseCode_INVALID_DATA)
requestWasOk <- false
return transaction.EndRequest()
Expand Down
64 changes: 63 additions & 1 deletion plc4go/internal/spi/model/DefaultPlcBrowseEvent.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@

package model

import "github.com/apache/plc4x/plc4go/pkg/api/model"
import (
"github.com/apache/plc4x/plc4go/internal/spi/utils"
"github.com/apache/plc4x/plc4go/pkg/api/model"
"github.com/pkg/errors"
)

type DefaultPlcBrowseEvent struct {
Request model.PlcBrowseRequest
Expand All @@ -43,3 +47,61 @@ func (d *DefaultPlcBrowseEvent) GetResult() model.PlcBrowseFoundField {
func (d *DefaultPlcBrowseEvent) GetErr() error {
return d.Err
}

func (d *DefaultPlcBrowseEvent) Serialize(writeBuffer utils.WriteBuffer) error {
if err := writeBuffer.PushContext("PlcBrowseEvent"); err != nil {
return err
}

if d.Request != nil {
if err := writeBuffer.PushContext("Request"); err != nil {
return err
}
if serializableField, ok := d.Request.(utils.Serializable); ok {
if err := serializableField.Serialize(writeBuffer); err != nil {
return err
}
} else {
return errors.Errorf("Error serializing. Field %T doesn't implement Serializable", d.Request)
}
if err := writeBuffer.PopContext("Request"); err != nil {
return err
}
}
if err := writeBuffer.WriteString("fieldName", uint32(len(d.FieldName)*8), "UTF-8", d.FieldName); err != nil {
return err
}
if d.Result != nil {
if err := writeBuffer.PushContext("Result"); err != nil {
return err
}
if serializableField, ok := d.Result.(utils.Serializable); ok {
if err := serializableField.Serialize(writeBuffer); err != nil {
return err
}
} else {
return errors.Errorf("Error serializing. Field %T doesn't implement Serializable", d.Result)
}
if err := writeBuffer.PopContext("Result"); err != nil {
return err
}
}
if d.Err != nil {
if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
return err
}
}

if err := writeBuffer.PopContext("PlcBrowseEvent"); err != nil {
return err
}
return nil
}

func (d *DefaultPlcBrowseEvent) String() string {
writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
if err := writeBuffer.WriteSerializable(d); err != nil {
return err.Error()
}
return writeBuffer.GetBox().String()
}
4 changes: 4 additions & 0 deletions plc4go/pkg/api/model/plc_response_code.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,7 @@ func (m PlcResponseCode) GetName() string {
return ""
}
}

func (m PlcResponseCode) String() string {
return m.GetName()
}
18 changes: 11 additions & 7 deletions plc4go/tests/drivers/tests/manual_cbus_driver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ func TestManualCBusBrowse(t *testing.T) {
log.Logger = log.
With().Caller().Logger().
Output(zerolog.ConsoleWriter{Out: os.Stderr}).
Level(zerolog.TraceLevel)
config.TraceTransactionManagerWorkers = true
config.TraceTransactionManagerTransactions = true
config.TraceDefaultMessageCodecWorker = true
Level(zerolog.InfoLevel)
config.TraceTransactionManagerWorkers = false
config.TraceTransactionManagerTransactions = false
config.TraceDefaultMessageCodecWorker = false
t.Skip()

connectionString := "c-bus://192.168.178.101?Monitor=false&MonitoredApplication1=0x00&MonitoredApplication2=0x00"
Expand All @@ -110,7 +110,8 @@ func TestManualCBusBrowse(t *testing.T) {
transports.RegisterTcpTransport(driverManager)
connectionResult := <-driverManager.GetConnection(connectionString)
if err := connectionResult.GetErr(); err != nil {
panic(err)
t.Error(err)
t.FailNow()
}
connection := connectionResult.GetConnection()
defer connection.Close()
Expand All @@ -120,6 +121,9 @@ func TestManualCBusBrowse(t *testing.T) {
if err != nil {
panic(err)
}
browseRequestResult := <-browseRequest.Execute()
fmt.Printf("%s", browseRequestResult)
browseRequestResult := <-browseRequest.ExecuteWithInterceptor(func(result model.PlcBrowseEvent) bool {
fmt.Printf("%s", result)
return true
})
fmt.Printf("%s", browseRequestResult.GetResponse())
}
6 changes: 5 additions & 1 deletion plc4go/tools/plc4xbrowser/ui/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,11 @@ var rootCommand = Command{
if err != nil {
return errors.Wrapf(err, "%s can't browse", connectionsString)
}
browseRequestResult := <-browseRequest.Execute()
browseRequestResult := <-browseRequest.ExecuteWithInterceptor(func(result model.PlcBrowseEvent) bool {
numberOfMessagesReceived++
messageReceived(numberOfMessagesReceived, time.Now(), browseRequest)
return true
})
if err := browseRequestResult.GetErr(); err != nil {
return errors.Wrapf(err, "%s can't browse", connectionsString)
}
Expand Down

0 comments on commit 78cd30b

Please sign in to comment.