--- a/project/sparkplug™_mqtt_host_b9741afd/function_blocks_8ad6e219/fb_primaryhost_ec6863e3/fb_primaryhostmessageconsumer_0bdfb382/0bdfb382e83f44ce8b28d26c6658b28d.object +++ b/project/sparkplug™_mqtt_host_b9741afd/function_blocks_8ad6e219/fb_primaryhost_ec6863e3/fb_primaryhostmessageconsumer_0bdfb382/0bdfb382e83f44ce8b28d26c6658b28d.object @@ -1 +1 @@ -{"payload":{"meta":{"Graph":{"@Type":"81297157","@Value":{"Guid":"(Guid)0bdfb382-e83f-44ce-8b28-d26c6658b28d","ParentGuid":"(Guid)00000000-0000-0000-0000-000000000000","Name":"(string)FB_PrimaryHostMessageConsumer","Properties":{"@Type":"2c41fa04:IDictionary","@Value":[{"@Key":"(Guid)829a18f2-c514-4f6e-9634-1df173429203","@Value":{"@Type":"829a18f2","@Value":{"ParentObjects":{"@Type":"fa2ee218:IDictionary","@Value":[{"@Key":"(Guid)21af5390-2942-461a-bf89-951aaf6999f1","@Value":"(Guid)ec6863e3-35a1-4237-b54f-4c4d98ebfb4e"}]}}}}]},"TypeGuid":"(Guid)6f9dac99-8de1-4efc-8465-68ac443b7d08","EmbeddedTypeGuids":{"@Type":"[Guid]","@Value":["(Guid)a9ed5b7e-75c5-4651-af16-d2c27e98cb94","(Guid)3b83b776-fb25-43b8-99f2-3c507c9143fc"]}}},"TypeInfos":{"2c41fa04":"{2c41fa04-1834-41c1-816e-303c7aa2c05b}","81297157":"{81297157-7ec9-45ce-845e-84cab2b88ade}","829a18f2":"{829a18f2-c514-4f6e-9634-1df173429203}","fa2ee218":"{fa2ee218-a39b-4b6d-b249-49dbddbd168a}","Guid":"System.Guid","string":"System.String"}},"object":{"Graph":{"@Type":"6f9dac99","@Value":{"SpecialFunc":{"@Type":"0db3d7bb:Enum","@Value":"None"},"Implementation":{"@Type":"3b83b776","@Value":{"TextDocument":{"@Type":"f3878285","@Value":{"TextBlobForSerialisation":"(string)_RecvMesg REF= pMQTT^.GetSubscriberMessage( MessageTopic => _RecvTopic );\n_TopicParser( pTopic := ADR( _RecvTopic ) ); //parses the topic\n\n// log the topic in debug level\nWriteHostLog( CmpLog.LogClass.LOG_DEBUG, 'Incoming message in topic: %s', TO_STRING( _RecvTopic ) ); \n\n// Insert RemoteEdgeSeqChecker here\n\n \n \nCASE _TopicParser.MessageType OF //SparkplugMessageTypes\n \n SPStack.SparkplugMessageTypes.NBIRTH: //Birth certificate for MQTT EoN nodes.\n \n _MyEdge REF= pPrimaryHost^.GetEdge( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n eError => _HandledError ); \n CASE _HandledError OF\n \n SPStack.ERROR.GroupIDNotFound: // ==> DETECTED NEW GROUP!\n \n _MyGroupId REF= pPrimaryHost^.allocGroupId( GroupId := _TopicParser.GroupId,\n eError => eError );\n //log new groupid\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered new GroupID: %s', TO_STRING( _TopicParser.GroupId ) ); \n\n IF eError = SPStack.ERROR.NO_ERROR THEN\n _MyEdge REF= pPrimaryHost^.allocEdgetoGroupId( EdgeId := _TopicParser.EdgeId,\n itfGroupID := _MyGroupId.itfGroupID,\n eError => eError );\n // Log new remote edge\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered Remote Edge: %s', TO_STRING( _TopicParser.EdgeId ) );\n\n IF eError = SPStack.ERROR.NO_ERROR THEN\n _MyEdge.ProcessNBIRTH( itfPrimaryHost := pPrimaryHost^,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError );\n ELSE\n xError := TRUE;\n //eError := eError;\n END_IF\n ELSE\n xError := TRUE;\n //eError := eError;\n END_IF\n \n \n SPStack.ERROR.EdgeIDNotFound: // ==> DETECTED NEW EDGE!\n \n _MyGroupId REF= pPrimaryHost^.GetGroupID( GroupId := _TopicParser.GroupId,\n eError => eError );\n \n //log new groupid\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered new GroupID: %s', TO_STRING( _TopicParser.GroupId ) ); \n\n IF eError = SPStack.ERROR.NO_ERROR THEN\n _MyEdge REF= pPrimaryHost^.allocEdgetoGroupId( EdgeId := _TopicParser.EdgeId,\n itfGroupID := _MyGroupId.itfGroupID,\n eError => eError );\n // Log new remote edge\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered Remote Edge: %s', TO_STRING( _TopicParser.EdgeId ) ); \n\n IF eError = SPStack.ERROR.NO_ERROR THEN\n _MyEdge.ProcessNBIRTH( itfPrimaryHost := pPrimaryHost^,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError );\n ELSE\n xError := TRUE;\n //eError := eError;\n END_IF\n ELSE\n xError := TRUE;\n //eError := eError;\n END_IF\n \n \n SPStack.ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE\n \n _MyEdge.ProcessNBIRTH( itfPrimaryHost := pPrimaryHost^,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError );\n ELSE\n ; //{info 'TODO: maybe some sort of error??'}\n END_CASE\n \n \n SPStack.SparkplugMessageTypes.NDATA: //Node data message.\n \n _MyEdge REF= pPrimaryHost^.GetEdge( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n eError => _HandledError );\n\n CASE _HandledError OF\n SPStack.ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE\n _MyEdge.ProcessNDATA( itfPrimaryHost := pPrimaryHost^,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError );\n \n ELSE\n xError := TRUE;\n eError := SPStack.Error.EdgeIDNotFound;\n WriteHostLog( CmpLog.LogClass.LOG_WARNING,\n 'PrimaryHost process NDATA metric error: %s',\n TO_STRING( _HandledError ) );\n \n END_CASE\n \n \n SPStack.SparkplugMessageTypes.NDEATH: //Death certificate for MQTT EoN nodes.\n \n _MyEdge REF= pPrimaryHost^.GetEdge( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n eError => _HandledError );\n\n // Log remote edge death\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered Remote Node Death: %s', TO_STRING( _TopicParser.EdgeId ) ); \n\n CASE _HandledError OF\n SPStack.ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE \n _MyEdge.ProcessNDEATH();\n ELSE\n xError := TRUE;\n eError := SPStack.ERROR.OhMy_ThatShouldNotHaveHappened;\n WriteHostLog( CmpLog.LogClass.LOG_ERROR,\n 'PrimaryHost process NDEATH metric error: %s',\n TO_STRING( _HandledError ) );\n END_CASE\n \n \n SPStack.SparkplugMessageTypes.DBIRTH: //Birth certificate forDevices.\n \n //TODO: Check if edge is online (isQualityOK). If not OK, DO NOT process the DBIRTH, instead just send a NCMD/Rebirth\n _MyDevice REF= pPrimaryHost^.GetDevice( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n DeviceId := _TopicParser.DeviceId,\n eError => _HandledError );\n\n CASE _HandledError OF\n \n SPStack.ERROR.GroupIDNotFound: // ==> DETECTED NEW GROUP! must rebirth the edge\n \n eError := SPStack.ERROR.NotImplemented;\n xError := TRUE;\n WriteHostLog( CmpLog.LogClass.LOG_WARNING,\n 'DBIRTH Received with no existing groupID, but haven$'t implemented NCMD Rebirth yet %s',\n '' );\n \n \n SPStack.ERROR.EdgeIDNotFound: // ==> DETECTED NEW EDGE! must rebirth the edge\n \n eError := SPStack.ERROR.NotImplemented;\n xError := TRUE;\n WriteHostLog( CmpLog.LogClass.LOG_WARNING,\n 'DBIRTH Received with no existing edge, but haven$'t implemented NCMD Rebirth yet %s',\n '' );\n \n \n SPStack.ERROR.DeviceIDNotFound: // ==> DETECTED NEW DEVICE!\n \n _MyEdge REF= pPrimaryHost^.GetEdge( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n eError => eError );\n\n IF eError = SPStack.ERROR.NO_ERROR THEN\n _MyDevice REF= pPrimaryHost^.allocDevicetoEdge( DeviceName := _TopicParser.DeviceId,\n itfEdge := _MyEdge.itfRemoteEoN,\n eError => eError );\n \n //\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered new Remote Device: %s', TO_STRING( _TopicParser.DeviceId ) ); \n\n IF eError = SPStack.ERROR.NO_ERROR THEN\n _MyDevice.ProcessDBIRTH( itfPrimaryHost := pPrimaryHost^,\n NodeName := _TopicParser.EdgeId,\n GroupId := _TopicParser.GroupId,\n DeviceName := _TopicParser.DeviceId,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError );\n \n ELSE\n xError := TRUE;\n //eError := eError;\n END_IF\n \n ELSE\n xError := TRUE;\n //eError := eError;\n END_IF\n \n \n SPStack.ERROR.NO_ERROR: // ==> UPDATE EXISTING DEVICE\n \n _MyDevice.ProcessDBIRTH( itfPrimaryHost := pPrimaryHost^,\n NodeName := _TopicParser.EdgeId,\n GroupId := _TopicParser.GroupId,\n DeviceName := _TopicParser.DeviceId,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError );\n \n ELSE\n ; //{info 'TODO: maybe some sort of error??'}\n END_CASE\n \n \n SPStack.SparkplugMessageTypes.DDEATH: //Death certificate for Devices.\n \n _MyDevice REF= pPrimaryHost^.GetDevice( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n DeviceId := _TopicParser.DeviceId,\n eError => _HandledError );\n \n // Log remote edge death\n WriteHostLog( CmpLog.LogClass.LOG_INFO, 'Host registered Remote Edge Death: %s', TO_STRING( _TopicParser.DeviceId ) ); \n\n CASE _HandledError OF\n SPStack.ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE \n _MyDevice.ProcessDDEATH();\n ELSE\n xError := TRUE;\n eError := SPStack.ERROR.OhMy_ThatShouldNotHaveHappened;\n WriteHostLog( CmpLog.LogClass.LOG_ERROR,\n 'PrimaryHost process DDEATH metric error: %s',\n TO_STRING( _HandledError ) );\n END_CASE\n \n \n SPStack.SparkplugMessageTypes.DDATA: // Device data message. \n \n _MyDevice REF= pPrimaryHost^.GetDevice( GroupId := _TopicParser.GroupId,\n EdgeId := _TopicParser.EdgeId,\n DeviceId := _TopicParser.DeviceId,\n eError => _HandledError );\n\n CASE _HandledError OF\n SPStack.ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE\n _MyDevice.ProcessDDATA( itfPrimaryHost := pPrimaryHost^,\n pMessage := _RecvMesg,\n xError => xError,\n eError => eError ); \n ELSE\n xError := TRUE;\n eError := SPStack.Error.DeviceIDNotFound;\n WriteHostLog( CmpLog.LogClass.LOG_ERROR,\n 'PrimaryHost process DDATA metric error: %s',\n TO_STRING( _HandledError ) );\n END_CASE\n \n \n SPStack.SparkplugMessageTypes.NCMD, //Node command message.\n \n SPStack.SparkplugMessageTypes.DCMD, //Device command message.\n SPStack.SparkplugMessageTypes.STATE: //Critical application state message\n ; //do nothing, ignore these\n \nELSE\n ; //{info 'TODO: maybe some sort of error??'}\nEND_CASE","LineInfoPersistence":"(string)0bdfb382-e83f-44ce-8b28-d26c6658b28d_Impl_LineIds"}}}},"Interface":{"@Type":"a9ed5b7e","@Value":{"TextDocument":{"@Type":"f3878285","@Value":{"TextBlobForSerialisation":"(string)FUNCTION_BLOCK FB_PrimaryHostMessageConsumer\nVAR_INPUT\n pPrimaryHost : POINTER TO FB_PrimaryHost;\n pMQTT : POINTER TO FB_PrimaryHostMQTT;\nEND_VAR\nVAR_OUTPUT\n xError : BOOL;\n eError : SPStack.ERROR;\nEND_VAR\nVAR\n //_itfPrimaryHost : IPrimaryHost;\n \n _MQTT_eError : MQTT.MQTT_ERROR;\n _RecvMesg : REFERENCE TO SPStack.FB_Payload;\n _RecvTopic : WSTRING( SPStack.GC_Sparkplug.supported_string_lengths );\n _HandledError : SPStack.ERROR; // an error that will be given back by a function, but we can handle the error. \n _MyGroupId : REFERENCE TO FB_GroupId;\n _MyEdge : REFERENCE TO FB_RemoteEdge;\n _MyDevice : REFERENCE TO FB_RemoteDevice;\n _TopicParser : FB_TopicParser;\nEND_VAR","LineInfoPersistence":"(string)0bdfb382-e83f-44ce-8b28-d26c6658b28d_Decl_LineIds"}}}},"UniqueIdGenerator":"(string)926","POULevel":{"@Type":"8e575c5b:Enum","@Value":"Standard"},"ChildObjectGuids":{"@Type":"ArrayList:IList","@Value":[]},"AddAttributeSubsequent":"(bool)False"}},"TypeInfos":{"0db3d7bb":"{0db3d7bb-cde0-4416-9a7b-ce49a0124323}","3b83b776":"{3b83b776-fb25-43b8-99f2-3c507c9143fc}","6f9dac99":"{6f9dac99-8de1-4efc-8465-68ac443b7d08}","8e575c5b":"{8e575c5b-1d37-49c6-941b-5c0ec7874787}","a9ed5b7e":"{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}","ArrayList":"System.Collections.ArrayList","bool":"System.Boolean","f3878285":"{f3878285-8e4f-490b-bb1b-9acbb7eb04db}","string":"System.String"}}},"FormatVersion":"1.0"} \ No newline at end of file +{"payload":{"meta":{"Graph":{"@Type":"81297157","@Value":{"Guid":"(Guid)0bdfb382-e83f-44ce-8b28-d26c6658b28d","ParentGuid":"(Guid)00000000-0000-0000-0000-000000000000","Name":"(string)FB_PrimaryHostMessageConsumer","Properties":{"@Type":"2c41fa04:IDictionary","@Value":[{"@Key":"(Guid)829a18f2-c514-4f6e-9634-1df173429203","@Value":{"@Type":"829a18f2","@Value":{"ParentObjects":{"@Type":"fa2ee218:IDictionary","@Value":[{"@Key":"(Guid)21af5390-2942-461a-bf89-951aaf6999f1","@Value":"(Guid)ec6863e3-35a1-4237-b54f-4c4d98ebfb4e"}]}}}}]},"TypeGuid":"(Guid)6f9dac99-8de1-4efc-8465-68ac443b7d08","EmbeddedTypeGuids":{"@Type":"[Guid]","@Value":["(Guid)a9ed5b7e-75c5-4651-af16-d2c27e98cb94","(Guid)3b83b776-fb25-43b8-99f2-3c507c9143fc"]}}},"TypeInfos":{"2c41fa04":"{2c41fa04-1834-41c1-816e-303c7aa2c05b}","81297157":"{81297157-7ec9-45ce-845e-84cab2b88ade}","829a18f2":"{829a18f2-c514-4f6e-9634-1df173429203}","fa2ee218":"{fa2ee218-a39b-4b6d-b249-49dbddbd168a}","Guid":"System.Guid","string":"System.String"}},"object":{"Graph":{"@Type":"6f9dac99","@Value":{"SpecialFunc":{"@Type":"0db3d7bb:Enum","@Value":"None"},"Implementation":{"@Type":"3b83b776","@Value":{"TextDocument":{"@Type":"f3878285","@Value":{"TextBlobForSerialisation":"(string)_RecvMesg REF= pMQTT^.GetSubscriberMessage( MessageTopic => _RecvTopic );\n\n//parses the topic\n_TopicParser( pTopic := ADR( _RecvTopic ) );\n\n// log the topic in debug level\nWriteHostLog( CmpLog.LogClass.LOG_DEBUG, 'Incoming message in topic: %s', TO_STRING( _RecvTopic ) );\n\nCASE _TopicParser.MessageType OF //SparkplugMessageTypes\n\n SPStack.SparkplugMessageTypes.NBIRTH: //Birth certificate for MQTT EoN nodes.\n\n ConsumeNBIRTHMessage( pPrimaryHost := pPrimaryHost,\n pTopicParser := ADR( _TopicParser ),\n GetEdgeError =>,\n allocGroupIdError =>,\n allocEdgetoGroupIdError =>,\n ProcessNBIRTHerror =>,\n xProcessNBIRTHError =>,\n GetGroupIDerror => );\n\n SPStack.SparkplugMessageTypes.NDATA: //Node data message.\n\n ConsumeNDATAMessage( pPrimaryHost := pPrimaryHost,\n pTopicParser := ADR( _TopicParser ), \n GetEdgeError =>,\n ProcessNDATAError =>,\n xProcessNDATAError => );\n\n SPStack.SparkplugMessageTypes.NDEATH: //Death certificate for MQTT EoN nodes.\n\n ConsumeNDEATHMessage( pPrimaryHost := pPrimaryHost,\n pTopicParser := ADR( _TopicParser ), \n GetEdgeError => );\n\n SPStack.SparkplugMessageTypes.DBIRTH: //Birth certificate forDevices.\n\n ConsumeDBIRTHMessage( pPrimaryHost := pPrimaryHost,\n pTopicParser := ADR( _TopicParser ), \n GetDeviceError =>,\n GetEdgeError =>,\n allocDevicetoEdge =>,\n ProcessDBIRTHerror =>,\n xProcessDBIRTHError => );\n\n SPStack.SparkplugMessageTypes.DDEATH: //Death certificate for Devices.\n\n ConsumeDDEATHMessage( pPrimaryHost := pPrimaryHost,\n pTopicParser := ADR( _TopicParser ),\n GetDeviceError =>, \n xGetDeviceError => );\n\n SPStack.SparkplugMessageTypes.DDATA: // Device data message. \n\n ConsumeDDATAMessage( pPrimaryHost := pPrimaryHost,\n pTopicParser := ADR( _TopicParser ), \n GetDeviceError=> , \n ProcessDDATAError=> , \n xProcessDDATAError=> );\n\n SPStack.SparkplugMessageTypes.NCMD, //Node command message.\n SPStack.SparkplugMessageTypes.DCMD, //Device command message.\n SPStack.SparkplugMessageTypes.STATE: //Critical application state message\n ; //do nothing, ignore these\n\nELSE\n ; //{info 'TODO: maybe some sort of error??'}\nEND_CASE","LineInfoPersistence":"(string)0bdfb382-e83f-44ce-8b28-d26c6658b28d_Impl_LineIds"}}}},"Interface":{"@Type":"a9ed5b7e","@Value":{"TextDocument":{"@Type":"f3878285","@Value":{"TextBlobForSerialisation":"(string)FUNCTION_BLOCK FB_PrimaryHostMessageConsumer\nVAR_INPUT\n pPrimaryHost : POINTER TO FB_PrimaryHost;\n pMQTT : POINTER TO FB_PrimaryHostMQTT;\nEND_VAR\nVAR_OUTPUT\n xError : BOOL;\n eError : SPStack.ERROR;\nEND_VAR\nVAR\n _TopicParser : FB_TopicParser;\n _RecvMesg : REFERENCE TO SPStack.FB_Payload;\n _RecvTopic : WSTRING( SPStack.GC_Sparkplug.supported_string_lengths );\nEND_VAR","LineInfoPersistence":"(string)0bdfb382-e83f-44ce-8b28-d26c6658b28d_Decl_LineIds"}}}},"UniqueIdGenerator":"(string)1006","POULevel":{"@Type":"8e575c5b:Enum","@Value":"Standard"},"ChildObjectGuids":{"@Type":"ArrayList:IList","@Value":[]},"AddAttributeSubsequent":"(bool)False"}},"TypeInfos":{"0db3d7bb":"{0db3d7bb-cde0-4416-9a7b-ce49a0124323}","3b83b776":"{3b83b776-fb25-43b8-99f2-3c507c9143fc}","6f9dac99":"{6f9dac99-8de1-4efc-8465-68ac443b7d08}","8e575c5b":"{8e575c5b-1d37-49c6-941b-5c0ec7874787}","a9ed5b7e":"{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}","ArrayList":"System.Collections.ArrayList","bool":"System.Boolean","f3878285":"{f3878285-8e4f-490b-bb1b-9acbb7eb04db}","string":"System.String"}}},"FormatVersion":"1.0"} \ No newline at end of file