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/07/26 10:53:48 UTC

[plc4x] branch develop updated: refactor(plc4go/s7): cleanup s7 code

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 955055aea refactor(plc4go/s7): cleanup s7 code
955055aea is described below

commit 955055aea56e037eb7564c5eee2698ad43ddeaac
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 26 12:53:42 2022 +0200

    refactor(plc4go/s7): cleanup s7 code
---
 plc4go/internal/s7/Connection.go         | 45 ++++++++++++++-------------
 plc4go/internal/s7/Field.go              | 53 ++++++++++++++------------------
 plc4go/internal/s7/MessageCodec.go       |  2 +-
 plc4go/internal/s7/Reader.go             | 16 +++++-----
 plc4go/internal/s7/Writer.go             | 14 ++++-----
 plc4go/internal/simulated/Reader_test.go | 12 ++------
 plc4go/internal/simulated/Writer_test.go | 12 ++------
 plc4go/internal/spi/PlcFieldHandler.go   |  2 +-
 8 files changed, 67 insertions(+), 89 deletions(-)

diff --git a/plc4go/internal/s7/Connection.go b/plc4go/internal/s7/Connection.go
index cde46c333..a1fc7024c 100644
--- a/plc4go/internal/s7/Connection.go
+++ b/plc4go/internal/s7/Connection.go
@@ -184,26 +184,26 @@ func (m *Connection) setupConnection(ch chan plc4go.PlcConnectionConnectResult)
 		if err := m.messageCodec.SendRequest(
 			m.createS7ConnectionRequest(cotpPacketConnectionResponse),
 			func(message spi.Message) bool {
-				tpktPacket := message.(readWriteModel.TPKTPacket)
-				if tpktPacket == nil {
+				tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
+				if !ok {
 					return false
 				}
-				cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
-				if cotpPacketData == nil {
+				cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
+				if !ok {
 					return false
 				}
-				messageResponseData := readWriteModel.CastS7MessageResponseData(cotpPacketData.GetPayload())
-				if messageResponseData == nil {
+				messageResponseData, ok := cotpPacketData.GetPayload().(readWriteModel.S7MessageResponseDataExactly)
+				if !ok {
 					return false
 				}
-				parameterSetupCommunication := readWriteModel.CastS7ParameterSetupCommunication(messageResponseData.GetParameter())
-				return parameterSetupCommunication != nil
+				_, ok = messageResponseData.GetParameter().(readWriteModel.S7ParameterSetupCommunicationExactly)
+				return ok
 			},
 			func(message spi.Message) error {
 				tpktPacket := message.(readWriteModel.TPKTPacket)
-				cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
-				messageResponseData := readWriteModel.CastS7MessageResponseData(cotpPacketData.GetPayload())
-				setupCommunication := readWriteModel.CastS7ParameterSetupCommunication(messageResponseData.GetParameter())
+				cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
+				messageResponseData := cotpPacketData.GetPayload().(readWriteModel.S7MessageResponseData)
+				setupCommunication := messageResponseData.GetParameter().(readWriteModel.S7ParameterSetupCommunication)
 				s7ConnectionResult <- setupCommunication
 				return nil
 			},
@@ -251,25 +251,26 @@ func (m *Connection) setupConnection(ch chan plc4go.PlcConnectionConnectResult)
 			if err := m.messageCodec.SendRequest(
 				m.createIdentifyRemoteMessage(),
 				func(message spi.Message) bool {
-					tpktPacket := readWriteModel.CastTPKTPacket(message)
-					if tpktPacket == nil {
+					tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
+					if !ok {
 						return false
 					}
-					cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
-					if cotpPacketData == nil {
+					cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
+					if !ok {
 						return false
 					}
-					messageUserData := readWriteModel.CastS7MessageUserData(cotpPacketData.GetPayload())
-					if messageUserData == nil {
+					messageUserData, ok := cotpPacketData.GetPayload().(readWriteModel.S7MessageUserDataExactly)
+					if !ok {
 						return false
 					}
-					return readWriteModel.CastS7PayloadUserData(messageUserData.GetPayload()) != nil
+					_, ok = messageUserData.GetPayload().(readWriteModel.S7PayloadUserDataExactly)
+					return ok
 				},
 				func(message spi.Message) error {
-					tpktPacket := readWriteModel.CastTPKTPacket(message)
-					cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
-					messageUserData := readWriteModel.CastS7MessageUserData(cotpPacketData.GetPayload())
-					s7IdentificationResult <- readWriteModel.CastS7PayloadUserData(messageUserData.GetPayload())
+					tpktPacket := message.(readWriteModel.TPKTPacket)
+					cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
+					messageUserData := cotpPacketData.GetPayload().(readWriteModel.S7MessageUserData)
+					s7IdentificationResult <- messageUserData.GetPayload().(readWriteModel.S7PayloadUserData)
 					return nil
 				},
 				func(err error) error {
diff --git a/plc4go/internal/s7/Field.go b/plc4go/internal/s7/Field.go
index cde3d126b..f28cd7b89 100644
--- a/plc4go/internal/s7/Field.go
+++ b/plc4go/internal/s7/Field.go
@@ -23,31 +23,31 @@ import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
-	readWrite "github.com/apache/plc4x/plc4go/protocols/s7/readwrite/model"
-	"github.com/pkg/errors"
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/s7/readwrite/model"
 )
 
-type S7PlcField interface {
-	GetDataType() readWrite.TransportSize
+type PlcField interface {
+	model.PlcField
+	GetDataType() readWriteModel.TransportSize
 	GetNumElements() uint16
 	GetBlockNumber() uint16
-	GetMemoryArea() readWrite.MemoryArea
+	GetMemoryArea() readWriteModel.MemoryArea
 	GetByteOffset() uint16
 	GetBitOffset() uint8
 }
 
-type PlcField struct {
+type plcField struct {
 	FieldType   FieldType
-	MemoryArea  readWrite.MemoryArea
+	MemoryArea  readWriteModel.MemoryArea
 	BlockNumber uint16
 	ByteOffset  uint16
 	BitOffset   uint8
 	NumElements uint16
-	Datatype    readWrite.TransportSize
+	Datatype    readWriteModel.TransportSize
 }
 
-func NewField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWrite.TransportSize) PlcField {
-	return PlcField{
+func NewField(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWriteModel.TransportSize) PlcField {
+	return plcField{
 		FieldType:   S7Field,
 		MemoryArea:  memoryArea,
 		BlockNumber: blockNumber,
@@ -59,13 +59,13 @@ func NewField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOffset ui
 }
 
 type PlcStringField struct {
-	PlcField
+	plcField
 	stringLength uint16
 }
 
-func NewStringField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWrite.TransportSize) PlcStringField {
+func NewStringField(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWriteModel.TransportSize) PlcStringField {
 	return PlcStringField{
-		PlcField: PlcField{
+		plcField: plcField{
 			FieldType:   S7StringField,
 			MemoryArea:  memoryArea,
 			BlockNumber: blockNumber,
@@ -78,51 +78,44 @@ func NewStringField(memoryArea readWrite.MemoryArea, blockNumber uint16, byteOff
 	}
 }
 
-func (m PlcField) GetAddressString() string {
+func (m plcField) GetAddressString() string {
 	// TODO: add missing variables like memory area, block number, byte offset, bit offset
 	return fmt.Sprintf("%d:%s[%d]", m.FieldType, m.Datatype, m.NumElements)
 }
 
-func (m PlcField) GetTypeName() string {
+func (m plcField) GetTypeName() string {
 	return m.Datatype.String()
 }
 
-func (m PlcField) GetDataType() readWrite.TransportSize {
+func (m plcField) GetDataType() readWriteModel.TransportSize {
 	return m.Datatype
 }
 
-func (m PlcField) GetNumElements() uint16 {
+func (m plcField) GetNumElements() uint16 {
 	return m.NumElements
 }
 
-func (m PlcField) GetBlockNumber() uint16 {
+func (m plcField) GetBlockNumber() uint16 {
 	return m.BlockNumber
 }
 
-func (m PlcField) GetMemoryArea() readWrite.MemoryArea {
+func (m plcField) GetMemoryArea() readWriteModel.MemoryArea {
 	return m.MemoryArea
 }
 
-func (m PlcField) GetByteOffset() uint16 {
+func (m plcField) GetByteOffset() uint16 {
 	return m.ByteOffset
 }
 
-func (m PlcField) GetBitOffset() uint8 {
+func (m plcField) GetBitOffset() uint8 {
 	return m.BitOffset
 }
 
-func (m PlcField) GetQuantity() uint16 {
+func (m plcField) GetQuantity() uint16 {
 	return m.NumElements
 }
 
-func CastTos7FieldFromPlcField(plcField model.PlcField) (PlcField, error) {
-	if s7Field, ok := plcField.(PlcField); ok {
-		return s7Field, nil
-	}
-	return PlcField{}, errors.New("couldn't cast to s7PlcField")
-}
-
-func (m PlcField) Serialize(writeBuffer utils.WriteBuffer) error {
+func (m plcField) Serialize(writeBuffer utils.WriteBuffer) error {
 	if err := writeBuffer.PushContext(m.FieldType.GetName()); err != nil {
 		return err
 	}
diff --git a/plc4go/internal/s7/MessageCodec.go b/plc4go/internal/s7/MessageCodec.go
index 41716b4b9..2a2f7f697 100644
--- a/plc4go/internal/s7/MessageCodec.go
+++ b/plc4go/internal/s7/MessageCodec.go
@@ -46,7 +46,7 @@ func (m *MessageCodec) GetCodec() spi.MessageCodec {
 func (m *MessageCodec) Send(message spi.Message) error {
 	log.Trace().Msg("Sending message")
 	// Cast the message to the correct type of struct
-	tpktPacket := model.CastTPKTPacket(message)
+	tpktPacket := message.(model.TPKTPacketExactly)
 	// Serialize the request
 	wb := utils.NewWriteBufferByteBased()
 	err := tpktPacket.Serialize(wb)
diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go
index a63cc1d03..379ae64b4 100644
--- a/plc4go/internal/s7/Reader.go
+++ b/plc4go/internal/s7/Reader.go
@@ -100,12 +100,12 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
 			if err := m.messageCodec.SendRequest(
 				tpktPacket,
 				func(message spi.Message) bool {
-					tpktPacket := readWriteModel.CastTPKTPacket(message)
-					if tpktPacket == nil {
+					tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
+					if !ok {
 						return false
 					}
-					cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
-					if cotpPacketData == nil {
+					cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
+					if !ok {
 						return false
 					}
 					payload := cotpPacketData.GetPayload()
@@ -117,8 +117,8 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
 				func(message spi.Message) error {
 					// Convert the response into an
 					log.Trace().Msg("convert response to ")
-					tpktPacket := readWriteModel.CastTPKTPacket(message)
-					cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
+					tpktPacket := message.(readWriteModel.TPKTPacket)
+					cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
 					payload := cotpPacketData.GetPayload()
 					// Convert the s7 response into a PLC4X response
 					log.Trace().Msg("convert response to PLC4X response")
@@ -211,7 +211,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.S7Message, readRequ
 
 	payloadItems := payload.GetItems()
 	for i, fieldName := range readRequest.GetFieldNames() {
-		field := readRequest.GetField(fieldName).(S7PlcField)
+		field := readRequest.GetField(fieldName).(PlcField)
 		payloadItem := payloadItems[i]
 
 		responseCode := decodeResponseCode(payloadItem.GetReturnCode())
@@ -236,7 +236,7 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.S7Message, readRequ
 // Currently we only support the S7 Any type of addresses. This helper simply converts the S7Field from PLC4X into
 // S7Address objects.
 func encodeS7Address(field model.PlcField) (readWriteModel.S7Address, error) {
-	s7Field, ok := field.(S7PlcField)
+	s7Field, ok := field.(PlcField)
 	if !ok {
 		return nil, errors.Errorf("Unsupported address type %t", field)
 	}
diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go
index 004f86cfa..3c99e31ae 100644
--- a/plc4go/internal/s7/Writer.go
+++ b/plc4go/internal/s7/Writer.go
@@ -103,12 +103,12 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
 			if err := m.messageCodec.SendRequest(
 				tpktPacket,
 				func(message spi.Message) bool {
-					tpktPacket := readWriteModel.CastTPKTPacket(message)
-					if tpktPacket == nil {
+					tpktPacket, ok := message.(readWriteModel.TPKTPacketExactly)
+					if !ok {
 						return false
 					}
-					cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
-					if cotpPacketData == nil {
+					cotpPacketData, ok := tpktPacket.GetPayload().(readWriteModel.COTPPacketDataExactly)
+					if !ok {
 						return false
 					}
 					payload := cotpPacketData.GetPayload()
@@ -120,8 +120,8 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
 				func(message spi.Message) error {
 					// Convert the response into an
 					log.Trace().Msg("convert response to ")
-					tpktPacket := readWriteModel.CastTPKTPacket(message)
-					cotpPacketData := readWriteModel.CastCOTPPacketData(tpktPacket.GetPayload())
+					tpktPacket := message.(readWriteModel.TPKTPacket)
+					cotpPacketData := tpktPacket.GetPayload().(readWriteModel.COTPPacketData)
 					payload := cotpPacketData.GetPayload()
 					// Convert the s7 response into a PLC4X response
 					log.Trace().Msg("convert response to PLC4X response")
@@ -225,7 +225,7 @@ func (m Writer) ToPlc4xWriteResponse(response readWriteModel.S7Message, writeReq
 }
 
 func serializePlcValue(field model.PlcField, plcValue values.PlcValue) (readWriteModel.S7VarPayloadDataItem, error) {
-	s7Field, ok := field.(S7PlcField)
+	s7Field, ok := field.(PlcField)
 	if !ok {
 		return nil, errors.Errorf("Unsupported address type %t", field)
 	}
diff --git a/plc4go/internal/simulated/Reader_test.go b/plc4go/internal/simulated/Reader_test.go
index 89e5e2701..00895f529 100644
--- a/plc4go/internal/simulated/Reader_test.go
+++ b/plc4go/internal/simulated/Reader_test.go
@@ -20,7 +20,7 @@
 package simulated
 
 import (
-	s72 "github.com/apache/plc4x/plc4go/internal/s7"
+	s7 "github.com/apache/plc4x/plc4go/internal/s7"
 	model3 "github.com/apache/plc4x/plc4go/internal/spi/model"
 	values2 "github.com/apache/plc4x/plc4go/internal/spi/values"
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -142,15 +142,7 @@ func TestReader_Read(t *testing.T) {
 			},
 			args: args{
 				fields: map[string]model.PlcField{
-					"test": s72.PlcField{
-						FieldType:   s72.S7Field,
-						MemoryArea:  model4.MemoryArea_DATA_BLOCKS,
-						BlockNumber: 1,
-						ByteOffset:  1,
-						BitOffset:   0,
-						NumElements: 1,
-						Datatype:    model4.TransportSize_BOOL,
-					},
+					"test": s7.NewField(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL),
 				},
 				fieldNames: []string{"test"},
 			},
diff --git a/plc4go/internal/simulated/Writer_test.go b/plc4go/internal/simulated/Writer_test.go
index 57126076f..774c2ff90 100644
--- a/plc4go/internal/simulated/Writer_test.go
+++ b/plc4go/internal/simulated/Writer_test.go
@@ -20,7 +20,7 @@
 package simulated
 
 import (
-	s72 "github.com/apache/plc4x/plc4go/internal/s7"
+	s7 "github.com/apache/plc4x/plc4go/internal/s7"
 	model3 "github.com/apache/plc4x/plc4go/internal/spi/model"
 	values2 "github.com/apache/plc4x/plc4go/internal/spi/values"
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -151,15 +151,7 @@ func TestWriter_Write(t *testing.T) {
 			},
 			args: args{
 				fields: map[string]model.PlcField{
-					"test": s72.PlcField{
-						FieldType:   s72.S7Field,
-						MemoryArea:  model4.MemoryArea_DATA_BLOCKS,
-						BlockNumber: 1,
-						ByteOffset:  1,
-						BitOffset:   0,
-						NumElements: 1,
-						Datatype:    model4.TransportSize_BOOL,
-					},
+					"test": s7.NewField(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL),
 				},
 				values: map[string]values.PlcValue{
 					"test": values2.NewPlcBOOL(false),
diff --git a/plc4go/internal/spi/PlcFieldHandler.go b/plc4go/internal/spi/PlcFieldHandler.go
index 4eebbd993..930997a19 100644
--- a/plc4go/internal/spi/PlcFieldHandler.go
+++ b/plc4go/internal/spi/PlcFieldHandler.go
@@ -22,6 +22,6 @@ package spi
 import "github.com/apache/plc4x/plc4go/pkg/api/model"
 
 type PlcFieldHandler interface {
-	// ParseQuery Parser function to parse query strings for a given driver and produce PlcField instances from that
+	// ParseQuery Parser function to parse query strings for a given driver and produce plcField instances from that
 	ParseQuery(query string) (model.PlcField, error)
 }