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/17 14:12:45 UTC

[plc4x] branch develop updated (ce2db6b31 -> 2651c2952)

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 ce2db6b31 fix(plc4go/cbus): avoid channel leak by adding wait groups
     new 33fdbda7b fix(plc4go/spi): fixed minor issue with RequestTransaction
     new 5fa24325b chore(cbus): fixed some typos
     new 2651c2952 feat(plc4go/cbus): introduced sal field

The 3 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:
 plc4go/internal/cbus/Field.go                      |  69 +++++++++++++
 plc4go/internal/cbus/FieldHandler.go               |  55 ++++++++++
 plc4go/internal/cbus/Subscriber.go                 | 113 ++++++++++++++++-----
 plc4go/internal/cbus/fieldtype_string.go           |  11 +-
 plc4go/spi/RequestTransactionManager.go            |   2 +-
 .../src/main/resources/protocols/cbus/c-bus.mspec  |   4 +-
 6 files changed, 221 insertions(+), 33 deletions(-)


[plc4x] 03/03: feat(plc4go/cbus): introduced sal field

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 2651c29520b20f9047dcae873614ec504f069031
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 17 16:12:38 2022 +0200

    feat(plc4go/cbus): introduced sal field
---
 plc4go/internal/cbus/Field.go            |  69 +++++++++++++++++++
 plc4go/internal/cbus/FieldHandler.go     |  55 +++++++++++++++
 plc4go/internal/cbus/Subscriber.go       | 113 ++++++++++++++++++++++++-------
 plc4go/internal/cbus/fieldtype_string.go |  11 +--
 4 files changed, 218 insertions(+), 30 deletions(-)

diff --git a/plc4go/internal/cbus/Field.go b/plc4go/internal/cbus/Field.go
index 76a89ff70..1a56bf62f 100644
--- a/plc4go/internal/cbus/Field.go
+++ b/plc4go/internal/cbus/Field.go
@@ -117,6 +117,22 @@ func NewCALGetstatusField(unitAddress readWriteModel.UnitAddress, parameter read
 	}
 }
 
+// SALField can be used to send SAL commands
+type SALField interface {
+	model.PlcField
+	GetApplication() readWriteModel.ApplicationIdContainer
+	GetSALCommand() string
+}
+
+func NewSALField(application readWriteModel.ApplicationIdContainer, salCommand string, numElements uint16) SALField {
+	return &salField{
+		fieldType:   SAL,
+		application: application,
+		salCommand:  salCommand,
+		numElements: numElements,
+	}
+}
+
 // SALMonitorField can be used to monitor sal fields
 type SALMonitorField interface {
 	model.PlcField
@@ -207,6 +223,12 @@ type calGetstatusField struct {
 	numElements uint16
 }
 
+type salField struct {
+	fieldType   FieldType
+	application readWriteModel.ApplicationIdContainer
+	salCommand  string
+	numElements uint16
+}
 type salMonitorField struct {
 	fieldType   FieldType
 	unitAddress readWriteModel.UnitAddress
@@ -445,6 +467,53 @@ func (c calGetstatusField) String() string {
 	return writeBuffer.GetBox().String()
 }
 
+func (s salField) GetApplication() readWriteModel.ApplicationIdContainer {
+	return s.application
+}
+
+func (s salField) GetSALCommand() string {
+	return s.salCommand
+}
+
+func (s salField) GetAddressString() string {
+	return fmt.Sprintf("sal/%s/%s", s.application, s.salCommand)
+}
+
+func (s salField) GetTypeName() string {
+	return s.fieldType.GetName()
+}
+
+func (s salField) GetQuantity() uint16 {
+	return s.numElements
+}
+
+func (s salField) Serialize(writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext(s.fieldType.GetName()); err != nil {
+		return err
+	}
+
+	if err := s.application.Serialize(writeBuffer); err != nil {
+		return err
+	}
+
+	if err := writeBuffer.WriteString("salCommand", uint32(len(s.salCommand)*8), "UTF-8", s.salCommand); err != nil {
+		return err
+	}
+
+	if err := writeBuffer.PopContext(s.fieldType.GetName()); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (s salField) String() string {
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(s); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
+
 func (s salMonitorField) GetAddressString() string {
 	// TODO: this is nonsense... fix that
 	return fmt.Sprintf("%d/%s%s[%d]", s.fieldType, s.unitAddress, s.application, s.numElements)
diff --git a/plc4go/internal/cbus/FieldHandler.go b/plc4go/internal/cbus/FieldHandler.go
index 11ecb391e..0efbda82e 100644
--- a/plc4go/internal/cbus/FieldHandler.go
+++ b/plc4go/internal/cbus/FieldHandler.go
@@ -21,6 +21,7 @@ package cbus
 
 import (
 	"encoding/hex"
+	"fmt"
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi/utils"
@@ -38,6 +39,7 @@ const (
 	CAL_RECALL
 	CAL_IDENTIFY
 	CAL_GETSTATUS
+	SAL
 	SAL_MONITOR
 	MMI_STATUS_MONITOR
 	UNIT_INFO
@@ -50,6 +52,7 @@ func (i FieldType) GetName() string {
 type FieldHandler struct {
 	statusRequestPattern *regexp.Regexp
 	calPattern           *regexp.Regexp
+	salPattern           *regexp.Regexp
 	salMonitorPattern    *regexp.Regexp
 	mmiMonitorPattern    *regexp.Regexp
 	unityQuery           *regexp.Regexp
@@ -59,12 +62,47 @@ func NewFieldHandler() FieldHandler {
 	return FieldHandler{
 		statusRequestPattern: regexp.MustCompile(`^status/(?P<statusRequestType>(?P<binary>binary)|level=0x(?P<startingGroupAddressLabel>00|20|40|60|80|A0|C0|E0))/(?P<application>.*)`),
 		calPattern:           regexp.MustCompile(`^cal/(?P<unitAddress>.+)/(?P<calType>recall=\[(?P<recallParamNo>\w+), ?(?P<recallCount>\d+)]|identify=(?P<identifyAttribute>\w+)|getstatus=(?P<getstatusParamNo>\w+), ?(?P<getstatusCount>\d+))`),
+		salPattern:           regexp.MustCompile(`^sal/(?P<application>.*)/(?P<salCommand>.*)`),
 		salMonitorPattern:    regexp.MustCompile(`^salmonitor/(?P<unitAddress>.+)/(?P<application>.+)`),
 		mmiMonitorPattern:    regexp.MustCompile(`^mmimonitor/(?P<unitAddress>.+)/(?P<application>.+)`),
 		unityQuery:           regexp.MustCompile(`^info/(?P<unitAddress>.+)/(?P<identifyAttribute>.+)`),
 	}
 }
 
+func ms2s[T fmt.Stringer](t []T) []string {
+	result := make([]string, len(t))
+	for i, stringer := range t {
+		result[i] = stringer.String()
+	}
+	return result
+}
+
+var PossibleSalCommands = map[readWriteModel.ApplicationId][]string{
+	readWriteModel.ApplicationId_RESERVED:                           nil, // TODO: Not yet implemented
+	readWriteModel.ApplicationId_FREE_USAGE:                         nil, // TODO: Not yet implemented
+	readWriteModel.ApplicationId_TEMPERATURE_BROADCAST:              ms2s(readWriteModel.TemperatureBroadcastCommandTypeValues),
+	readWriteModel.ApplicationId_ROOM_CONTROL_SYSTEM:                nil, // TODO: Not yet implemented
+	readWriteModel.ApplicationId_LIGHTING:                           ms2s(readWriteModel.LightingCommandTypeValues),
+	readWriteModel.ApplicationId_VENTILATION:                        ms2s(readWriteModel.LightingCommandTypeValues),
+	readWriteModel.ApplicationId_IRRIGATION_CONTROL:                 ms2s(readWriteModel.LightingCommandTypeValues),
+	readWriteModel.ApplicationId_POOLS_SPAS_PONDS_FOUNTAINS_CONTROL: ms2s(readWriteModel.LightingCommandTypeValues),
+	readWriteModel.ApplicationId_HEATING:                            ms2s(readWriteModel.LightingCommandTypeValues),
+	readWriteModel.ApplicationId_AIR_CONDITIONING:                   ms2s(readWriteModel.AirConditioningCommandTypeValues),
+	readWriteModel.ApplicationId_TRIGGER_CONTROL:                    ms2s(readWriteModel.TriggerControlCommandTypeValues),
+	readWriteModel.ApplicationId_ENABLE_CONTROL:                     ms2s(readWriteModel.EnableControlCommandTypeValues),
+	readWriteModel.ApplicationId_AUDIO_AND_VIDEO:                    ms2s(readWriteModel.LightingCommandTypeValues),
+	readWriteModel.ApplicationId_SECURITY:                           ms2s(readWriteModel.SecurityCommandTypeValues),
+	readWriteModel.ApplicationId_METERING:                           ms2s(readWriteModel.MeteringCommandTypeValues),
+	readWriteModel.ApplicationId_ACCESS_CONTROL:                     ms2s(readWriteModel.AccessControlCommandTypeValues),
+	readWriteModel.ApplicationId_CLOCK_AND_TIMEKEEPING:              ms2s(readWriteModel.ClockAndTimekeepingCommandTypeValues),
+	readWriteModel.ApplicationId_TELEPHONY_STATUS_AND_CONTROL:       ms2s(readWriteModel.TelephonyCommandTypeValues),
+	readWriteModel.ApplicationId_MEASUREMENT:                        ms2s(readWriteModel.MeasurementCommandTypeValues),
+	readWriteModel.ApplicationId_TESTING:                            nil, // TODO: Not yet implemented
+	readWriteModel.ApplicationId_MEDIA_TRANSPORT_CONTROL:            ms2s(readWriteModel.MediaTransportControlCommandTypeValues),
+	readWriteModel.ApplicationId_ERROR_REPORTING:                    ms2s(readWriteModel.ErrorReportingCommandTypeValues),
+	readWriteModel.ApplicationId_HVAC_ACTUATOR:                      ms2s(readWriteModel.LightingCommandTypeValues),
+}
+
 func (m FieldHandler) ParseQuery(query string) (model.PlcField, error) {
 	if match := utils.GetSubgroupMatches(m.statusRequestPattern, query); match != nil {
 		var startingGroupAddressLabel *byte
@@ -200,6 +238,23 @@ func (m FieldHandler) ParseQuery(query string) (model.PlcField, error) {
 		default:
 			return nil, errors.Errorf("Invalid cal type %s", calTypeArgument)
 		}
+	} else if match := utils.GetSubgroupMatches(m.salPattern, query); match != nil {
+		application, err := applicationIdFromArgument(match["application"])
+		if err != nil {
+			return nil, errors.Wrap(err, "Error getting application id from argument")
+		}
+		salCommand := match["salCommand"]
+		if salCommand == "" {
+			return nil, errors.Wrap(err, "Error getting salCommand from argument")
+		}
+		isValid := false
+		for _, request := range PossibleSalCommands[application.ApplicationId()] {
+			isValid = isValid || strings.HasPrefix(salCommand, request)
+		}
+		if !isValid {
+			return nil, errors.Errorf("Invalid sal command %s for %s. Allowed requests: %s", salCommand, application, PossibleSalCommands[application.ApplicationId()])
+		}
+		panic("Implement me")
 	} else if match := utils.GetSubgroupMatches(m.salMonitorPattern, query); match != nil {
 		var unitAddress readWriteModel.UnitAddress
 		{
diff --git a/plc4go/internal/cbus/Subscriber.go b/plc4go/internal/cbus/Subscriber.go
index a61406a1e..aebaf1993 100644
--- a/plc4go/internal/cbus/Subscriber.go
+++ b/plc4go/internal/cbus/Subscriber.go
@@ -24,10 +24,11 @@ import (
 	"fmt"
 	apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/pkg/api/values"
-	"github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
 	spiModel "github.com/apache/plc4x/plc4go/spi/model"
 	spiValues "github.com/apache/plc4x/plc4go/spi/values"
 	"github.com/rs/zerolog/log"
+	"strings"
 	"time"
 )
 
@@ -78,10 +79,10 @@ func (m *Subscriber) Unsubscribe(ctx context.Context, unsubscriptionRequest apiM
 	return result
 }
 
-func (m *Subscriber) handleMonitoredMMI(calReply model.CALReply) bool {
+func (m *Subscriber) handleMonitoredMMI(calReply readWriteModel.CALReply) bool {
 	var unitAddressString string
 	switch calReply := calReply.(type) {
-	case model.CALReplyLongExactly:
+	case readWriteModel.CALReplyLongExactly:
 		if calReply.GetIsUnitAddress() {
 			unitAddressString = fmt.Sprintf("u%d", calReply.GetUnitAddress().GetAddress())
 		} else {
@@ -96,7 +97,6 @@ func (m *Subscriber) handleMonitoredMMI(calReply model.CALReply) bool {
 		unitAddressString = "u0" // On short form it should be always unit 0 TODO: double check that
 	}
 	calData := calReply.GetCalData()
-	// TODO: filter
 	for _, subscriptionRequest := range m.subscriptionRequests {
 		fields := map[string]apiModel.PlcField{}
 		types := map[string]spiModel.SubscriptionType{}
@@ -114,7 +114,11 @@ func (m *Subscriber) handleMonitoredMMI(calReply model.CALReply) bool {
 				continue
 			}
 			if unitAddress := field.GetUnitAddress(); unitAddress != nil {
-				// TODO: filter in unit address
+				unitSuffix := fmt.Sprintf("u%d", unitAddress.GetAddress())
+				if !strings.HasSuffix(unitAddressString, unitSuffix) {
+					log.Debug().Msgf("Current address string %s has not the suffix %s", unitAddressString, unitSuffix)
+					continue
+				}
 			}
 			application := field.GetApplication()
 			// TODO: filter in unit address
@@ -130,20 +134,70 @@ func (m *Subscriber) handleMonitoredMMI(calReply model.CALReply) bool {
 
 			var applicationString string
 
+			isLevel := true
+			blockStart := byte(0x0)
 			switch calData := calData.(type) {
-			case model.CALDataStatusExactly:
+			case readWriteModel.CALDataStatusExactly:
 				applicationString = calData.GetApplication().ApplicationId().String()
-			case model.CALDataStatusExtendedExactly:
+				blockStart = calData.GetBlockStart()
+
+				statusBytes := calData.GetStatusBytes()
+				responseCodes[fieldName] = apiModel.PlcResponseCode_OK
+				plcListValues := make([]values.PlcValue, len(statusBytes)*4)
+				for i, statusByte := range statusBytes {
+					plcListValues[i*4+0] = spiValues.NewPlcSTRING(statusByte.GetGav0().String())
+					plcListValues[i*4+1] = spiValues.NewPlcSTRING(statusByte.GetGav1().String())
+					plcListValues[i*4+2] = spiValues.NewPlcSTRING(statusByte.GetGav2().String())
+					plcListValues[i*4+3] = spiValues.NewPlcSTRING(statusByte.GetGav3().String())
+				}
+				plcValues[fieldName] = spiValues.NewPlcList(plcListValues)
+			case readWriteModel.CALDataStatusExtendedExactly:
 				applicationString = calData.GetApplication().ApplicationId().String()
+				isLevel = calData.GetCoding() == readWriteModel.StatusCoding_LEVEL_BY_ELSEWHERE || calData.GetCoding() == readWriteModel.StatusCoding_LEVEL_BY_THIS_SERIAL_INTERFACE
+				blockStart = calData.GetBlockStart()
+				coding := calData.GetCoding()
+				switch coding {
+				case readWriteModel.StatusCoding_BINARY_BY_THIS_SERIAL_INTERFACE:
+					fallthrough
+				case readWriteModel.StatusCoding_BINARY_BY_ELSEWHERE:
+					statusBytes := calData.GetStatusBytes()
+					responseCodes[fieldName] = apiModel.PlcResponseCode_OK
+					plcListValues := make([]values.PlcValue, len(statusBytes)*4)
+					for i, statusByte := range statusBytes {
+						plcListValues[i*4+0] = spiValues.NewPlcSTRING(statusByte.GetGav0().String())
+						plcListValues[i*4+1] = spiValues.NewPlcSTRING(statusByte.GetGav1().String())
+						plcListValues[i*4+2] = spiValues.NewPlcSTRING(statusByte.GetGav2().String())
+						plcListValues[i*4+3] = spiValues.NewPlcSTRING(statusByte.GetGav3().String())
+					}
+					plcValues[fieldName] = spiValues.NewPlcList(plcListValues)
+				case readWriteModel.StatusCoding_LEVEL_BY_THIS_SERIAL_INTERFACE:
+					fallthrough
+				case readWriteModel.StatusCoding_LEVEL_BY_ELSEWHERE:
+					levelInformation := calData.GetLevelInformation()
+					responseCodes[fieldName] = apiModel.PlcResponseCode_OK
+					plcListValues := make([]values.PlcValue, len(levelInformation))
+					for i, levelInformation := range levelInformation {
+						switch levelInformation := levelInformation.(type) {
+						case readWriteModel.LevelInformationAbsentExactly:
+							plcListValues[i] = spiValues.NewPlcSTRING("is absent")
+						case readWriteModel.LevelInformationCorruptedExactly:
+							plcListValues[i] = spiValues.NewPlcSTRING("corrupted")
+						case readWriteModel.LevelInformationNormalExactly:
+							plcListValues[i] = spiValues.NewPlcUSINT(levelInformation.GetActualLevel())
+						default:
+							panic("Impossible case")
+						}
+					}
+					plcValues[fieldName] = spiValues.NewPlcList(plcListValues)
+				}
 			default:
 				return false
 			}
-			// TODO: we might need to encode more data into the address from sal data
-			address[fieldName] = fmt.Sprintf("/%s/%s", unitAddressString, applicationString)
-
-			// TODO: map values properly
-			plcValues[fieldName] = spiValues.NewPlcSTRING(fmt.Sprintf("%s", calData))
-			responseCodes[fieldName] = apiModel.PlcResponseCode_OK
+			statusType := "binary"
+			if isLevel {
+				statusType = fmt.Sprintf("level=0x%X", blockStart)
+			}
+			address[fieldName] = fmt.Sprintf("status/%s/%s", statusType, applicationString)
 
 			// Assemble a PlcSubscription event
 			if len(plcValues) > 0 {
@@ -156,7 +210,7 @@ func (m *Subscriber) handleMonitoredMMI(calReply model.CALReply) bool {
 	return true
 }
 
-func (m *Subscriber) handleMonitoredSal(sal model.MonitoredSAL) bool {
+func (m *Subscriber) handleMonitoredSal(sal readWriteModel.MonitoredSAL) bool {
 	// TODO: filter
 	for _, subscriptionRequest := range m.subscriptionRequests {
 		fields := map[string]apiModel.PlcField{}
@@ -174,12 +228,6 @@ func (m *Subscriber) handleMonitoredSal(sal model.MonitoredSAL) bool {
 				plcValues[fieldName] = nil
 				continue
 			}
-			if unitAddress := field.GetUnitAddress(); unitAddress != nil {
-				// TODO: filter in unit address
-			}
-			application := field.GetApplication()
-			// TODO: filter in unit address
-			_ = application
 
 			subscriptionType := subscriptionRequest.GetType(fieldName)
 			// TODO: handle subscriptionType
@@ -189,10 +237,10 @@ func (m *Subscriber) handleMonitoredSal(sal model.MonitoredSAL) bool {
 			types[fieldName] = subscriptionRequest.GetType(fieldName)
 			intervals[fieldName] = subscriptionRequest.GetInterval(fieldName)
 
-			var salData model.SALData
+			var salData readWriteModel.SALData
 			var unitAddressString, applicationString string
 			switch sal := sal.(type) {
-			case model.MonitoredSALLongFormSmartModeExactly:
+			case readWriteModel.MonitoredSALLongFormSmartModeExactly:
 				if sal.GetIsUnitAddress() {
 					unitAddressString = fmt.Sprintf("u%d", sal.GetUnitAddress().GetAddress())
 				} else {
@@ -205,13 +253,28 @@ func (m *Subscriber) handleMonitoredSal(sal model.MonitoredSAL) bool {
 				}
 				applicationString = sal.GetApplication().ApplicationId().String()
 				salData = sal.GetSalData()
-			case model.MonitoredSALShortFormBasicModeExactly:
+			case readWriteModel.MonitoredSALShortFormBasicModeExactly:
 				unitAddressString = "u0" // On short form it should be always unit 0 TODO: double check that
 				applicationString = sal.GetApplication().ApplicationId().String()
 				salData = sal.GetSalData()
 			}
-			// TODO: we might need to encode more data into the address from sal data
-			address[fieldName] = fmt.Sprintf("/%s/%s", unitAddressString, applicationString)
+			if unitAddress := field.GetUnitAddress(); unitAddress != nil {
+				unitSuffix := fmt.Sprintf("u%d", unitAddress.GetAddress())
+				if !strings.HasSuffix(unitAddressString, unitSuffix) {
+					log.Debug().Msgf("Current address string %s has not the suffix %s", unitAddressString, unitSuffix)
+					continue
+				}
+			}
+
+			if application := field.GetApplication(); application != readWriteModel.ApplicationIdContainer_RESERVED_FF {
+				if actualApplicationIdString := application.ApplicationId().String(); applicationString != actualApplicationIdString {
+					log.Debug().Msgf("Current application id %s  doesn't matchactual id %s", unitAddressString, actualApplicationIdString)
+					continue
+				}
+			}
+
+			// TODO: we need to map commands e.g. if we get a MeteringDataElectricityConsumption we can map that to MeteringDataMeasureElectricity
+			address[fieldName] = fmt.Sprintf("sal/%s/%s", applicationString, "TODO")
 
 			// TODO: map values properly
 			plcValues[fieldName] = spiValues.NewPlcSTRING(fmt.Sprintf("%s", salData))
diff --git a/plc4go/internal/cbus/fieldtype_string.go b/plc4go/internal/cbus/fieldtype_string.go
index 0456cc67d..8e2831e00 100644
--- a/plc4go/internal/cbus/fieldtype_string.go
+++ b/plc4go/internal/cbus/fieldtype_string.go
@@ -29,14 +29,15 @@ func _() {
 	_ = x[CAL_RECALL-1]
 	_ = x[CAL_IDENTIFY-2]
 	_ = x[CAL_GETSTATUS-3]
-	_ = x[SAL_MONITOR-4]
-	_ = x[MMI_STATUS_MONITOR-5]
-	_ = x[UNIT_INFO-6]
+	_ = x[SAL-4]
+	_ = x[SAL_MONITOR-5]
+	_ = x[MMI_STATUS_MONITOR-6]
+	_ = x[UNIT_INFO-7]
 }
 
-const _FieldType_name = "STATUSCAL_RECALLCAL_IDENTIFYCAL_GETSTATUSSAL_MONITORMMI_STATUS_MONITORUNIT_INFO"
+const _FieldType_name = "STATUSCAL_RECALLCAL_IDENTIFYCAL_GETSTATUSSALSAL_MONITORMMI_STATUS_MONITORUNIT_INFO"
 
-var _FieldType_index = [...]uint8{0, 6, 16, 28, 41, 52, 70, 79}
+var _FieldType_index = [...]uint8{0, 6, 16, 28, 41, 44, 55, 73, 82}
 
 func (i FieldType) String() string {
 	if i >= FieldType(len(_FieldType_index)-1) {


[plc4x] 02/03: chore(cbus): fixed some typos

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 5fa24325bb7929d73dc289eeb38782fcafbd682f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 17 16:10:07 2022 +0200

    chore(cbus): fixed some typos
---
 protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec b/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec
index bfbde154d..02f6dc9f9 100644
--- a/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec
+++ b/protocols/c-bus/src/main/resources/protocols/cbus/c-bus.mspec
@@ -1385,7 +1385,7 @@
             [simple LightingData poolsSpaPondsFountainsData]
         ]
         ['HEATING'                              *Heating
-            // Note: the documentation states that the data for ventilation uses LightingData
+            // Note: the documentation states that the data for heating uses LightingData
             [simple LightingData heatingData]
         ]
         ['AIR_CONDITIONING'                     *AirConditioning
@@ -1398,7 +1398,7 @@
             [simple EnableControlData enableControlData]
         ]
         ['AUDIO_AND_VIDEO'                      *AudioAndVideo
-             // Note: the documentation states that the data for ventilation uses LightingData
+             // Note: the documentation states that the data for audio video data uses LightingData
             [simple LightingData audioVideoData]
         ]
         ['SECURITY'                             *Security


[plc4x] 01/03: fix(plc4go/spi): fixed minor issue with RequestTransaction

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 33fdbda7be4b1c8ec3e01d5ee2429bd64d7139e0
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Aug 17 16:09:45 2022 +0200

    fix(plc4go/spi): fixed minor issue with RequestTransaction
---
 plc4go/spi/RequestTransactionManager.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/plc4go/spi/RequestTransactionManager.go b/plc4go/spi/RequestTransactionManager.go
index 4f8f236bd..2c3ceca6e 100644
--- a/plc4go/spi/RequestTransactionManager.go
+++ b/plc4go/spi/RequestTransactionManager.go
@@ -203,7 +203,7 @@ type RequestTransaction struct {
 	transactionLog zerolog.Logger
 }
 
-func (t RequestTransaction) String() string {
+func (t *RequestTransaction) String() string {
 	return fmt.Sprintf("Transaction{tid:%d}", t.transactionId)
 }