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/19 15:04:53 UTC

[plc4x] 01/02: feat(cbus): implemented measurement application

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 238d80befe526880228ac2cbf26cda038358c8f3
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 19 16:12:33 2022 +0200

    feat(cbus): implemented measurement application
---
 .../cbus/readwrite/model/SALDataMeasurement.go     | 54 +++++++++++++++++++---
 .../src/main/resources/protocols/cbus/c-bus.mspec  | 18 ++++----
 2 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataMeasurement.go b/plc4go/protocols/cbus/readwrite/model/SALDataMeasurement.go
index 49ec1b55b..da497f8a4 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataMeasurement.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataMeasurement.go
@@ -31,6 +31,8 @@ type SALDataMeasurement interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
+	// GetMeasurementData returns MeasurementData (property field)
+	GetMeasurementData() MeasurementData
 }
 
 // SALDataMeasurementExactly can be used when we want exactly this type and not a type which fulfills SALDataMeasurement.
@@ -43,6 +45,7 @@ type SALDataMeasurementExactly interface {
 // _SALDataMeasurement is the data-structure of this message
 type _SALDataMeasurement struct {
 	*_SALData
+	MeasurementData MeasurementData
 }
 
 ///////////////////////////////////////////////////////////
@@ -67,10 +70,25 @@ func (m *_SALDataMeasurement) GetParent() SALData {
 	return m._SALData
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_SALDataMeasurement) GetMeasurementData() MeasurementData {
+	return m.MeasurementData
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewSALDataMeasurement factory function for _SALDataMeasurement
-func NewSALDataMeasurement(salData SALData) *_SALDataMeasurement {
+func NewSALDataMeasurement(measurementData MeasurementData, salData SALData) *_SALDataMeasurement {
 	_result := &_SALDataMeasurement{
-		_SALData: NewSALData(salData),
+		MeasurementData: measurementData,
+		_SALData:        NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -98,6 +116,9 @@ func (m *_SALDataMeasurement) GetLengthInBits() uint16 {
 func (m *_SALDataMeasurement) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (measurementData)
+	lengthInBits += m.MeasurementData.GetLengthInBits()
+
 	return lengthInBits
 }
 
@@ -114,9 +135,17 @@ func SALDataMeasurementParse(readBuffer utils.ReadBuffer, applicationId Applicat
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, errors.WithStack(utils.ParseValidationError{"MEASUREMENT Not yet implemented"})
+	// Simple Field (measurementData)
+	if pullErr := readBuffer.PullContext("measurementData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for measurementData")
+	}
+	_measurementData, _measurementDataErr := MeasurementDataParse(readBuffer)
+	if _measurementDataErr != nil {
+		return nil, errors.Wrap(_measurementDataErr, "Error parsing 'measurementData' field of SALDataMeasurement")
+	}
+	measurementData := _measurementData.(MeasurementData)
+	if closeErr := readBuffer.CloseContext("measurementData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for measurementData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataMeasurement"); closeErr != nil {
@@ -125,7 +154,8 @@ func SALDataMeasurementParse(readBuffer utils.ReadBuffer, applicationId Applicat
 
 	// Create a partially initialized instance
 	_child := &_SALDataMeasurement{
-		_SALData: &_SALData{},
+		MeasurementData: measurementData,
+		_SALData:        &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -139,6 +169,18 @@ func (m *_SALDataMeasurement) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for SALDataMeasurement")
 		}
 
+		// Simple Field (measurementData)
+		if pushErr := writeBuffer.PushContext("measurementData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for measurementData")
+		}
+		_measurementDataErr := writeBuffer.WriteSerializable(m.GetMeasurementData())
+		if popErr := writeBuffer.PopContext("measurementData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for measurementData")
+		}
+		if _measurementDataErr != nil {
+			return errors.Wrap(_measurementDataErr, "Error serializing 'measurementData' field")
+		}
+
 		if popErr := writeBuffer.PopContext("SALDataMeasurement"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for SALDataMeasurement")
 		}
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 74cb2cf49..44ebb46af 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
@@ -1357,7 +1357,7 @@
             [simple TelephonyData telephonyData]
         ]
         ['MEASUREMENT'                          *Measurement
-            [validation '1==2' "MEASUREMENT Not yet implemented"] // TODO: implement me
+            [simple MeasurementData measurementData]
         ]
         ['TESTING'                              *Testing
             [validation '1==2' "TESTING Not yet implemented"] // TODO: implement me
@@ -3282,6 +3282,14 @@
     ]
 ]
 
+[enum uint 8 MeasurementCommandTypeContainer(MeasurementCommandType commandType, uint 5 numBytes)
+    ['0x0E' MeasurementCommandChannelMeasurementData    ['MEASUREMENT_EVENT',  '6']]
+]
+
+[enum uint 4 MeasurementCommandType
+    ['0x00' MEASUREMENT_EVENT              ]
+]
+
 [enum uint 8 MeasurementUnits
     ['0x00' CELSIUS                 ]
     ['0x01' AMPS                    ]
@@ -3327,14 +3335,6 @@
     ['0xFF' CUSTOM                  ]
 ]
 
-[enum uint 8 MeasurementCommandTypeContainer(MeasurementCommandType commandType, uint 5 numBytes)
-    ['0x0E' MeasurementCommandChannelMeasurementData    ['MEASUREMENT_EVENT',  '6']]
-]
-
-[enum uint 4 MeasurementCommandType
-    ['0x00' MEASUREMENT_EVENT              ]
-]
-
 [type ReplyOrConfirmation(CBusOptions cBusOptions, uint 16 messageLength, RequestContext requestContext)
     [peek    byte peekedByte                                                ]
     [virtual bit  isAlpha '(peekedByte >= 0x67) && (peekedByte <= 0x7A)'    ]