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 16:07:26 UTC

[plc4x] 01/02: feat(cbus): implemented heating 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 4d1b020c27ffbf86bc8cec881d9b961806019d95
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jul 19 18:00:11 2022 +0200

    feat(cbus): implemented heating application
---
 .../cbus/readwrite/model/SALDataHeating.go         | 54 +++++++++++++++++---
 .../readwrite/model/SALDataIrrigationControl.go    | 58 +++++++++++-----------
 .../model/SALDataPoolsSpasPondsFountainsControl.go | 58 +++++++++++-----------
 .../src/main/resources/protocols/cbus/c-bus.mspec  |  9 ++--
 4 files changed, 111 insertions(+), 68 deletions(-)

diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go b/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go
index 41cb5e248..f5dbe26b7 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataHeating.go
@@ -31,6 +31,8 @@ type SALDataHeating interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
+	// GetHeatingData returns HeatingData (property field)
+	GetHeatingData() LightingData
 }
 
 // SALDataHeatingExactly can be used when we want exactly this type and not a type which fulfills SALDataHeating.
@@ -43,6 +45,7 @@ type SALDataHeatingExactly interface {
 // _SALDataHeating is the data-structure of this message
 type _SALDataHeating struct {
 	*_SALData
+	HeatingData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -67,10 +70,25 @@ func (m *_SALDataHeating) GetParent() SALData {
 	return m._SALData
 }
 
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_SALDataHeating) GetHeatingData() LightingData {
+	return m.HeatingData
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
 // NewSALDataHeating factory function for _SALDataHeating
-func NewSALDataHeating(salData SALData) *_SALDataHeating {
+func NewSALDataHeating(heatingData LightingData, salData SALData) *_SALDataHeating {
 	_result := &_SALDataHeating{
-		_SALData: NewSALData(salData),
+		HeatingData: heatingData,
+		_SALData:    NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -98,6 +116,9 @@ func (m *_SALDataHeating) GetLengthInBits() uint16 {
 func (m *_SALDataHeating) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
+	// Simple field (heatingData)
+	lengthInBits += m.HeatingData.GetLengthInBits()
+
 	return lengthInBits
 }
 
@@ -114,9 +135,17 @@ func SALDataHeatingParse(readBuffer utils.ReadBuffer, applicationId ApplicationI
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Validation
-	if !(bool((1) == (2))) {
-		return nil, errors.WithStack(utils.ParseValidationError{"HEATING Not yet implemented"})
+	// Simple Field (heatingData)
+	if pullErr := readBuffer.PullContext("heatingData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for heatingData")
+	}
+	_heatingData, _heatingDataErr := LightingDataParse(readBuffer)
+	if _heatingDataErr != nil {
+		return nil, errors.Wrap(_heatingDataErr, "Error parsing 'heatingData' field of SALDataHeating")
+	}
+	heatingData := _heatingData.(LightingData)
+	if closeErr := readBuffer.CloseContext("heatingData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for heatingData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataHeating"); closeErr != nil {
@@ -125,7 +154,8 @@ func SALDataHeatingParse(readBuffer utils.ReadBuffer, applicationId ApplicationI
 
 	// Create a partially initialized instance
 	_child := &_SALDataHeating{
-		_SALData: &_SALData{},
+		HeatingData: heatingData,
+		_SALData:    &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -139,6 +169,18 @@ func (m *_SALDataHeating) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for SALDataHeating")
 		}
 
+		// Simple Field (heatingData)
+		if pushErr := writeBuffer.PushContext("heatingData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for heatingData")
+		}
+		_heatingDataErr := writeBuffer.WriteSerializable(m.GetHeatingData())
+		if popErr := writeBuffer.PopContext("heatingData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for heatingData")
+		}
+		if _heatingDataErr != nil {
+			return errors.Wrap(_heatingDataErr, "Error serializing 'heatingData' field")
+		}
+
 		if popErr := writeBuffer.PopContext("SALDataHeating"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for SALDataHeating")
 		}
diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go b/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go
index f66465d0b..5d84bc332 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataIrrigationControl.go
@@ -31,8 +31,8 @@ type SALDataIrrigationControl interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
-	// GetVentilationData returns VentilationData (property field)
-	GetVentilationData() LightingData
+	// GetIrrigationControlData returns IrrigationControlData (property field)
+	GetIrrigationControlData() LightingData
 }
 
 // SALDataIrrigationControlExactly can be used when we want exactly this type and not a type which fulfills SALDataIrrigationControl.
@@ -45,7 +45,7 @@ type SALDataIrrigationControlExactly interface {
 // _SALDataIrrigationControl is the data-structure of this message
 type _SALDataIrrigationControl struct {
 	*_SALData
-	VentilationData LightingData
+	IrrigationControlData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -75,8 +75,8 @@ func (m *_SALDataIrrigationControl) GetParent() SALData {
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *_SALDataIrrigationControl) GetVentilationData() LightingData {
-	return m.VentilationData
+func (m *_SALDataIrrigationControl) GetIrrigationControlData() LightingData {
+	return m.IrrigationControlData
 }
 
 ///////////////////////
@@ -85,10 +85,10 @@ func (m *_SALDataIrrigationControl) GetVentilationData() LightingData {
 ///////////////////////////////////////////////////////////
 
 // NewSALDataIrrigationControl factory function for _SALDataIrrigationControl
-func NewSALDataIrrigationControl(ventilationData LightingData, salData SALData) *_SALDataIrrigationControl {
+func NewSALDataIrrigationControl(irrigationControlData LightingData, salData SALData) *_SALDataIrrigationControl {
 	_result := &_SALDataIrrigationControl{
-		VentilationData: ventilationData,
-		_SALData:        NewSALData(salData),
+		IrrigationControlData: irrigationControlData,
+		_SALData:              NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -116,8 +116,8 @@ func (m *_SALDataIrrigationControl) GetLengthInBits() uint16 {
 func (m *_SALDataIrrigationControl) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
-	// Simple field (ventilationData)
-	lengthInBits += m.VentilationData.GetLengthInBits()
+	// Simple field (irrigationControlData)
+	lengthInBits += m.IrrigationControlData.GetLengthInBits()
 
 	return lengthInBits
 }
@@ -135,17 +135,17 @@ func SALDataIrrigationControlParse(readBuffer utils.ReadBuffer, applicationId Ap
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (ventilationData)
-	if pullErr := readBuffer.PullContext("ventilationData"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for ventilationData")
+	// Simple Field (irrigationControlData)
+	if pullErr := readBuffer.PullContext("irrigationControlData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for irrigationControlData")
 	}
-	_ventilationData, _ventilationDataErr := LightingDataParse(readBuffer)
-	if _ventilationDataErr != nil {
-		return nil, errors.Wrap(_ventilationDataErr, "Error parsing 'ventilationData' field of SALDataIrrigationControl")
+	_irrigationControlData, _irrigationControlDataErr := LightingDataParse(readBuffer)
+	if _irrigationControlDataErr != nil {
+		return nil, errors.Wrap(_irrigationControlDataErr, "Error parsing 'irrigationControlData' field of SALDataIrrigationControl")
 	}
-	ventilationData := _ventilationData.(LightingData)
-	if closeErr := readBuffer.CloseContext("ventilationData"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for ventilationData")
+	irrigationControlData := _irrigationControlData.(LightingData)
+	if closeErr := readBuffer.CloseContext("irrigationControlData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for irrigationControlData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataIrrigationControl"); closeErr != nil {
@@ -154,8 +154,8 @@ func SALDataIrrigationControlParse(readBuffer utils.ReadBuffer, applicationId Ap
 
 	// Create a partially initialized instance
 	_child := &_SALDataIrrigationControl{
-		VentilationData: ventilationData,
-		_SALData:        &_SALData{},
+		IrrigationControlData: irrigationControlData,
+		_SALData:              &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -169,16 +169,16 @@ func (m *_SALDataIrrigationControl) Serialize(writeBuffer utils.WriteBuffer) err
 			return errors.Wrap(pushErr, "Error pushing for SALDataIrrigationControl")
 		}
 
-		// Simple Field (ventilationData)
-		if pushErr := writeBuffer.PushContext("ventilationData"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for ventilationData")
+		// Simple Field (irrigationControlData)
+		if pushErr := writeBuffer.PushContext("irrigationControlData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for irrigationControlData")
 		}
-		_ventilationDataErr := writeBuffer.WriteSerializable(m.GetVentilationData())
-		if popErr := writeBuffer.PopContext("ventilationData"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for ventilationData")
+		_irrigationControlDataErr := writeBuffer.WriteSerializable(m.GetIrrigationControlData())
+		if popErr := writeBuffer.PopContext("irrigationControlData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for irrigationControlData")
 		}
-		if _ventilationDataErr != nil {
-			return errors.Wrap(_ventilationDataErr, "Error serializing 'ventilationData' field")
+		if _irrigationControlDataErr != nil {
+			return errors.Wrap(_irrigationControlDataErr, "Error serializing 'irrigationControlData' field")
 		}
 
 		if popErr := writeBuffer.PopContext("SALDataIrrigationControl"); popErr != nil {
diff --git a/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go b/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go
index e7f8ad09b..01315bfe7 100644
--- a/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go
+++ b/plc4go/protocols/cbus/readwrite/model/SALDataPoolsSpasPondsFountainsControl.go
@@ -31,8 +31,8 @@ type SALDataPoolsSpasPondsFountainsControl interface {
 	utils.LengthAware
 	utils.Serializable
 	SALData
-	// GetVentilationData returns VentilationData (property field)
-	GetVentilationData() LightingData
+	// GetPoolsSpaPondsFountainsData returns PoolsSpaPondsFountainsData (property field)
+	GetPoolsSpaPondsFountainsData() LightingData
 }
 
 // SALDataPoolsSpasPondsFountainsControlExactly can be used when we want exactly this type and not a type which fulfills SALDataPoolsSpasPondsFountainsControl.
@@ -45,7 +45,7 @@ type SALDataPoolsSpasPondsFountainsControlExactly interface {
 // _SALDataPoolsSpasPondsFountainsControl is the data-structure of this message
 type _SALDataPoolsSpasPondsFountainsControl struct {
 	*_SALData
-	VentilationData LightingData
+	PoolsSpaPondsFountainsData LightingData
 }
 
 ///////////////////////////////////////////////////////////
@@ -75,8 +75,8 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) GetParent() SALData {
 /////////////////////// Accessors for property fields.
 ///////////////////////
 
-func (m *_SALDataPoolsSpasPondsFountainsControl) GetVentilationData() LightingData {
-	return m.VentilationData
+func (m *_SALDataPoolsSpasPondsFountainsControl) GetPoolsSpaPondsFountainsData() LightingData {
+	return m.PoolsSpaPondsFountainsData
 }
 
 ///////////////////////
@@ -85,10 +85,10 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) GetVentilationData() LightingDa
 ///////////////////////////////////////////////////////////
 
 // NewSALDataPoolsSpasPondsFountainsControl factory function for _SALDataPoolsSpasPondsFountainsControl
-func NewSALDataPoolsSpasPondsFountainsControl(ventilationData LightingData, salData SALData) *_SALDataPoolsSpasPondsFountainsControl {
+func NewSALDataPoolsSpasPondsFountainsControl(poolsSpaPondsFountainsData LightingData, salData SALData) *_SALDataPoolsSpasPondsFountainsControl {
 	_result := &_SALDataPoolsSpasPondsFountainsControl{
-		VentilationData: ventilationData,
-		_SALData:        NewSALData(salData),
+		PoolsSpaPondsFountainsData: poolsSpaPondsFountainsData,
+		_SALData:                   NewSALData(salData),
 	}
 	_result._SALData._SALDataChildRequirements = _result
 	return _result
@@ -116,8 +116,8 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) GetLengthInBits() uint16 {
 func (m *_SALDataPoolsSpasPondsFountainsControl) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
-	// Simple field (ventilationData)
-	lengthInBits += m.VentilationData.GetLengthInBits()
+	// Simple field (poolsSpaPondsFountainsData)
+	lengthInBits += m.PoolsSpaPondsFountainsData.GetLengthInBits()
 
 	return lengthInBits
 }
@@ -135,17 +135,17 @@ func SALDataPoolsSpasPondsFountainsControlParse(readBuffer utils.ReadBuffer, app
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (ventilationData)
-	if pullErr := readBuffer.PullContext("ventilationData"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for ventilationData")
+	// Simple Field (poolsSpaPondsFountainsData)
+	if pullErr := readBuffer.PullContext("poolsSpaPondsFountainsData"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for poolsSpaPondsFountainsData")
 	}
-	_ventilationData, _ventilationDataErr := LightingDataParse(readBuffer)
-	if _ventilationDataErr != nil {
-		return nil, errors.Wrap(_ventilationDataErr, "Error parsing 'ventilationData' field of SALDataPoolsSpasPondsFountainsControl")
+	_poolsSpaPondsFountainsData, _poolsSpaPondsFountainsDataErr := LightingDataParse(readBuffer)
+	if _poolsSpaPondsFountainsDataErr != nil {
+		return nil, errors.Wrap(_poolsSpaPondsFountainsDataErr, "Error parsing 'poolsSpaPondsFountainsData' field of SALDataPoolsSpasPondsFountainsControl")
 	}
-	ventilationData := _ventilationData.(LightingData)
-	if closeErr := readBuffer.CloseContext("ventilationData"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for ventilationData")
+	poolsSpaPondsFountainsData := _poolsSpaPondsFountainsData.(LightingData)
+	if closeErr := readBuffer.CloseContext("poolsSpaPondsFountainsData"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for poolsSpaPondsFountainsData")
 	}
 
 	if closeErr := readBuffer.CloseContext("SALDataPoolsSpasPondsFountainsControl"); closeErr != nil {
@@ -154,8 +154,8 @@ func SALDataPoolsSpasPondsFountainsControlParse(readBuffer utils.ReadBuffer, app
 
 	// Create a partially initialized instance
 	_child := &_SALDataPoolsSpasPondsFountainsControl{
-		VentilationData: ventilationData,
-		_SALData:        &_SALData{},
+		PoolsSpaPondsFountainsData: poolsSpaPondsFountainsData,
+		_SALData:                   &_SALData{},
 	}
 	_child._SALData._SALDataChildRequirements = _child
 	return _child, nil
@@ -169,16 +169,16 @@ func (m *_SALDataPoolsSpasPondsFountainsControl) Serialize(writeBuffer utils.Wri
 			return errors.Wrap(pushErr, "Error pushing for SALDataPoolsSpasPondsFountainsControl")
 		}
 
-		// Simple Field (ventilationData)
-		if pushErr := writeBuffer.PushContext("ventilationData"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for ventilationData")
+		// Simple Field (poolsSpaPondsFountainsData)
+		if pushErr := writeBuffer.PushContext("poolsSpaPondsFountainsData"); pushErr != nil {
+			return errors.Wrap(pushErr, "Error pushing for poolsSpaPondsFountainsData")
 		}
-		_ventilationDataErr := writeBuffer.WriteSerializable(m.GetVentilationData())
-		if popErr := writeBuffer.PopContext("ventilationData"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for ventilationData")
+		_poolsSpaPondsFountainsDataErr := writeBuffer.WriteSerializable(m.GetPoolsSpaPondsFountainsData())
+		if popErr := writeBuffer.PopContext("poolsSpaPondsFountainsData"); popErr != nil {
+			return errors.Wrap(popErr, "Error popping for poolsSpaPondsFountainsData")
 		}
-		if _ventilationDataErr != nil {
-			return errors.Wrap(_ventilationDataErr, "Error serializing 'ventilationData' field")
+		if _poolsSpaPondsFountainsDataErr != nil {
+			return errors.Wrap(_poolsSpaPondsFountainsDataErr, "Error serializing 'poolsSpaPondsFountainsData' field")
 		}
 
 		if popErr := writeBuffer.PopContext("SALDataPoolsSpasPondsFountainsControl"); popErr != nil {
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 88f746d6e..ad67589ba 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
@@ -1322,14 +1322,15 @@
         ]
         ['IRRIGATION_CONTROL'                   *IrrigationControl
              // Note: the documentation states that the data for irrigation control uses LightingData
-            [simple LightingData ventilationData]
+            [simple LightingData irrigationControlData]
         ]
         ['POOLS_SPAS_PONDS_FOUNTAINS_CONTROL'   *PoolsSpasPondsFountainsControl
-             // Note: the documentation states that the data for pools spas ponds fauntains uses LightingData
-            [simple LightingData ventilationData]
+             // Note: the documentation states that the data for pools spas ponds fountains uses LightingData
+            [simple LightingData poolsSpaPondsFountainsData]
         ]
         ['HEATING'                              *Heating
-            [validation '1==2' "HEATING Not yet implemented"] // TODO: implement me
+            // Note: the documentation states that the data for ventilation uses LightingData
+            [simple LightingData heatingData]
         ]
         ['AIR_CONDITIONING'                     *AirConditioning
             [simple AirConditioningData airConditioningData]