[r539]: / trunk / mqttsparkplugb / mqttsparkplugb / SparkplugB / Function Blocks / FB_Payload / FB_PayloadMetric / svnobj  Maximize  Restore  History

Download this file

86 lines (84 with data), 54.9 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
ELSIF NOT xDecode AND NOT xEncode THEN //DO NOTHING, ALL OUTPUTS OFF
	xDecodeError:=FALSE;
	eDecodeError := ERROR.NO_ERROR;
	xEncodeError:=FALSE;
	eEncodeError := ERROR.NO_ERROR;
ELSIF xDecode AND NOT xEncode THEN //Decode
	xDecodeBusy:=TRUE;
ELSIF NOT xDecode AND xEncode THEN //Encode
	xEncodeBusy:=TRUE;
END_IF%
IF xDecodeBusy THEN
	InitializeStructure();
	
	eDecodeState := PayloadDecodeStates.object_getlength;
	//decode length
	FOR ProtobufBlobIndex := ProtobufBlobIndex TO finalByteIndex DO
		CASE eDecodeState OF
		PayloadDecodeStates.object_getmember:
			CASE myProtobufBlob[ProtobufBlobIndex] OF
			16#00://end of data? padding byte? ERROR
				xDecodeError := TRUE;
				eDecodeError := ERROR.PayloadFound00;
				eDecodeState := PayloadDecodeStates.object_getis_historical;
			ProtobufedId.Metric_is_transient:
				eDecodeState := PayloadDecodeStates.object_getis_transient;
			ProtobufedId.Metric_is_null:
				eDecodeState := PayloadDecodeStates.object_getis_null;
			ProtobufedId.Metric_metadata:
				eDecodeState := PayloadDecodeStates.object_getboolean_value;
			ProtobufedId.Metric_string_value:
				eDecodeState := PayloadDecodeStates.object_getstring_value;
			ProtobufedId.Metric_bytes_value[0]:
			ProtobufedId.Metric_dataset_value[0]:
			ProtobufedId.Metric_template_value[0]:
			ProtobufedId.Metric_extension_value[0]:
				eDecodeError := ERROR.PayloadFoundExtensions;
			ELSE  //extension... error
			END_CASE
		PayloadDecodeStates.object_getname :
			_xHasName := TRUE;
			dviTemp := OwnerPayload.DecodeNextVarInt(); //updates i to end of the varint
			_uliAlias := dviTemp.Uint64;
		PayloadDecodeStates.object_gettimestamp :
			_xHasTimeStamp := TRUE;
			_uliTimestamp := dviTemp.uliDateTime;
		PayloadDecodeStates.object_gettype :
			_xHasDatatype := TRUE;
			_udiDatatype := dviTemp.UInt32;
		PayloadDecodeStates.object_getint_value :
			_eHasValue := MetricProtobufsType.int_value;
			_rValue  := OwnerPayload.DecodeNextFloat(); //updates i to end of the varint
		PayloadDecodeStates.object_getdouble_value :
			_eHasValue := MetricProtobufsType.double_value;
			_sValue  := OwnerPayload.DecodeNextString(); //updates i to end of the string
		PayloadDecodeStates.object_getis_historical : 
            _xHasIs_historical := TRUE;
		PayloadDecodeStates.object_getis_transient : 
            _xIs_transient := dviTemp.Boolean;
            _xHasIs_null := TRUE;
		PayloadDecodeStates.object_getmetadata_length :
			_metadataendindex := dviTemp.Int32 + ProtobufBlobIndex;
			ELSE
			END_IF
			ProtobufedId.MetaData_is_multi_part : 
				eDecodeState := PayloadDecodeStates.object_getMetaData_is_multi_part;
			ProtobufedId.MetaData_size          :
				eDecodeState := PayloadDecodeStates.object_getMetaData_size;
				eDecodeState := PayloadDecodeStates.object_getMetaData_seq;
			ProtobufedId.MetaData_file_type     : 
				eDecodeState := PayloadDecodeStates.object_getMetaData_file_type;
				eDecodeState := PayloadDecodeStates.object_getMetaData_md5;
		PayloadDecodeStates.object_getMetaData_is_multi_part :
            _myMetaData.is_multi_part := dviTemp.Boolean;
			_myHasMetaData.xHasContent_type := TRUE;
            _myMetaData.content_type := OwnerPayload.DecodeNextString(); //updates i to end of the string
			_myHasMetaData.xHasSize := TRUE;
		PayloadDecodeStates.object_getMetaData_seq           :
            _myMetaData.seq := dviTemp.UInt64;
			_myHasMetaData.xHasFile_name := TRUE;
            _myMetaData.file_name := OwnerPayload.DecodeNextString(); //updates i to end of the string
			_myHasMetaData.xHasFile_type := TRUE;
            _myMetaData.file_type := OwnerPayload.DecodeNextString(); //updates i to end of the string
			_myHasMetaData.xHasMd5 := TRUE;
            _myMetaData.md5 := OwnerPayload.DecodeNextString(); //updates i to end of the string
			_myHasMetaData.xHasDescription := TRUE;