private static CodeMemberMethod CreateDeserializeCodeMemberMethod(TypeInfo messageBaseClass, Message message)
        {
            string readerParamName     = "reader";
            string messageVariableName = "message";

            string   ns       = "MavLink4Net.Messages.Common";
            TypeInfo typeInfo = TypeInfoHelper.GetTypeInfo(ns, message);

            CodeMemberMethod codeMemberMethod = new CodeMemberMethod();

            codeMemberMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            codeMemberMethod.Name       = "Deserialize";
            codeMemberMethod.ReturnType = new CodeTypeReference(messageBaseClass.FullName);
            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(BinaryReader), readerParamName));

            CodeTypeReference classTypeReference = new CodeTypeReference(typeInfo.FullName);

            codeMemberMethod.Statements.Add(new CodeVariableDeclarationStatement(
                                                classTypeReference, messageVariableName,
                                                new CodeObjectCreateExpression(classTypeReference)));

            AddReadPropertyStatements(codeMemberMethod, message, readerParamName, messageVariableName, ns);

            codeMemberMethod.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(messageVariableName)));

            return(codeMemberMethod);
        }
        private static CodeMemberMethod CreateSerializeCodeMemberMethod(TypeInfo messageBaseClass, Message message, string messagesNamespace)
        {
            string writerParamName  = "writer";
            string messageParamName = "message";

            CodeMemberMethod codeMemberMethod = new CodeMemberMethod();

            codeMemberMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            codeMemberMethod.Name       = "Serialize";

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(BinaryWriter), writerParamName));
            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(messageBaseClass.FullName, messageParamName));

            string messageVariableName = "tMessage";

            TypeInfo messageTypeInfo = TypeInfoHelper.GetTypeInfo(messagesNamespace, message);

            codeMemberMethod.Statements.Add(new CodeVariableDeclarationStatement(
                                                new CodeTypeReference(messageTypeInfo.FullName), messageVariableName,
                                                new CodeSnippetExpression($"{messageParamName} as {messageTypeInfo.FullName}")));

            AddWritePropertyStatements(codeMemberMethod, message, writerParamName, messageVariableName);

            return(codeMemberMethod);
        }
示例#3
0
        private static void GenerateEnumFile(EnumGenerationParams pParams, MessageDefinitions.Data.Enum enumeration, TypeInfo typeInfo, CodeGeneratorOptions options, CodeDomProvider codeProvider)
        {
            string          filename = TypeInfoHelper.GetFilename(typeInfo);
            String          filePath = Path.Combine(pParams.OutputPath, filename);
            CodeCompileUnit unit     = EnumGeneratorHelper.CreateCodeCompileUnit(typeInfo, enumeration);

            codeProvider.GenerateCodeFromCompileUnit(unit, options, filePath);
        }
示例#4
0
        private static void GenerateMessageClassFile(MessageGenerationParams pParams, MessageDefinitions.Data.Message message, CodeGeneratorOptions options, CodeDomProvider codeProvider, IDictionary <MessageDefinitions.Data.Enum, TypeInfo> enumTypeInfoByName)
        {
            TypeInfo        typeInfo = TypeInfoHelper.GetTypeInfo(pParams.Namespace, message);
            string          filename = TypeInfoHelper.GetFilename(typeInfo);
            String          filePath = Path.Combine(pParams.OutputPath, filename);
            CodeCompileUnit unit     = MessageGeneratorHelper.CreateCodeCompileUnit(typeInfo, message, pParams.BaseClassTypeInfo, pParams.MessageTypeEnumTypeInfo, enumTypeInfoByName);

            codeProvider.GenerateCodeFromCompileUnit(unit, options, filePath);
        }
示例#5
0
        private static void GenerateMessageTypeEnum(CodeDomProvider codeProvider, CodeGeneratorOptions options, TypeInfo messageTypeEnumTypeInfo, string outputPath, IEnumerable <Message> messages)
        {
            MessageTypeEnumGenerationParams typeEnumGenerationParams = new MessageTypeEnumGenerationParams();
            string messageTypeEnumFilename = TypeInfoHelper.GetFilename(messageTypeEnumTypeInfo);

            typeEnumGenerationParams.OutputFilePath = Path.Combine(outputPath, messageTypeEnumFilename);
            typeEnumGenerationParams.TypeInfo       = messageTypeEnumTypeInfo;

            GenerateMessageTypeEnum(codeProvider, options, typeEnumGenerationParams, messages);
        }
示例#6
0
        private static void GenerateCrcExtraProvider(CodeDomProvider codeProvider, CodeGeneratorOptions options, TypeInfo crcExtraProviderClassTypeInfo, IEnumerable <Message> messages, string outputPath, TypeInfo messageTypeEnumTypeInfo)
        {
            CrcExtraProviderGenerationParams messageFactoryGenerationParams = new CrcExtraProviderGenerationParams();
            string filename = TypeInfoHelper.GetFilename(crcExtraProviderClassTypeInfo);

            messageFactoryGenerationParams.OutputFilePath          = Path.Combine(outputPath, filename);
            messageFactoryGenerationParams.TypeInfo                = crcExtraProviderClassTypeInfo;
            messageFactoryGenerationParams.MessageTypeEnumTypeInfo = messageTypeEnumTypeInfo;

            GenerateCrcExtraProvider(codeProvider, options, messageFactoryGenerationParams, messages);
        }
示例#7
0
        private static void GenerateMessageFactory(CodeDomProvider codeProvider, CodeGeneratorOptions options, TypeInfo serializerFactoryClassTypeInfo, IEnumerable <Message> messages, string outputPath, TypeInfo messageTypeEnumTypeInfo, TypeInfo messageInterfaceTypeInfo)
        {
            MessageFactoryGenerationParams messageFactoryGenerationParams = new MessageFactoryGenerationParams();
            string factoryFilename = TypeInfoHelper.GetFilename(serializerFactoryClassTypeInfo);

            messageFactoryGenerationParams.OutputFilePath           = Path.Combine(outputPath, factoryFilename);
            messageFactoryGenerationParams.TypeInfo                 = serializerFactoryClassTypeInfo;
            messageFactoryGenerationParams.CommonMessagesNamespace  = ConstantHelper.Namespaces.Root_Messages_Common;
            messageFactoryGenerationParams.MessageTypeEnumTypeInfo  = messageTypeEnumTypeInfo;
            messageFactoryGenerationParams.MessageInterfaceTypeInfo = messageInterfaceTypeInfo;

            GenerateMessageFactory(codeProvider, options, messageFactoryGenerationParams, messages);
        }
示例#8
0
        public static void GenerateFiles(string messageDefinitionPath, string outputPath, string language, MessageDefinitions.Data.MavLink mavLink)
        {
            String messagesPath = Path.Combine(outputPath, ConstantHelper.MessagesFolderName);

            System.IO.Directory.CreateDirectory(messagesPath);

            string serializationOutputPath = Path.Combine(outputPath, ConstantHelper.MessagesSerializationFolderName);

            System.IO.Directory.CreateDirectory(serializationOutputPath);

            string messagesCommonPath = Path.Combine(messagesPath, ConstantHelper.CommonName);

            System.IO.Directory.CreateDirectory(messagesCommonPath);

            string serializerCommonOutputPath = Path.Combine(serializationOutputPath, ConstantHelper.CommonName);

            System.IO.Directory.CreateDirectory(serializerCommonOutputPath);

            TypeInfo messageBaseClassTypeInfo       = TypeInfoHelper.GetMessageClassTypeInfo();
            TypeInfo messageInterfaceTypeInfo       = TypeInfoHelper.GetMessageInterfaceTypeInfo();
            TypeInfo messageTypeEnumTypeInfo        = TypeInfoHelper.GetMavMessageTypeTypeInfo();
            TypeInfo serializerInterfaceTypeInfo    = TypeInfoHelper.GetSerializerInterfaceTypeInfo();
            TypeInfo serializerFactoryClassTypeInfo = TypeInfoHelper.GetSerializerFactoryTypeInfo();
            TypeInfo messageFactoryClassTypeInfo    = TypeInfoHelper.GetMessageFactoryTypeInfo();
            TypeInfo crcExtraProviderClassTypeInfo  = TypeInfoHelper.GetCrcExtraProviderTypeInfo();

            CodeGeneratorOptions options = new CodeGeneratorOptions()
            {
                BracingStyle = "C"
            };
            CodeDomProvider codeProvider = CreateCodeDomProvider(language);

            GenerateMessageTypeEnum(codeProvider, options, messageTypeEnumTypeInfo, messagesPath, mavLink.Messages);

            GenerateCrcExtraProvider(codeProvider, options, crcExtraProviderClassTypeInfo, mavLink.Messages, messagesPath, messageTypeEnumTypeInfo);

            IDictionary <MessageDefinitions.Data.Enum, TypeInfo> typeInfoByEnum = GetTypeInfoByEnum(mavLink.Enums, ConstantHelper.Namespaces.Root_Messages_Common);

            GenerateEnumFiles(codeProvider, options, messagesCommonPath, typeInfoByEnum);

            GenerateMessageClassFiles(codeProvider, options, messagesCommonPath, messageBaseClassTypeInfo, messageTypeEnumTypeInfo, mavLink.Messages, typeInfoByEnum);

            GenerateSerializerClassFiles(codeProvider, options, serializerCommonOutputPath, mavLink.Messages, serializerInterfaceTypeInfo, messageInterfaceTypeInfo);

            GenerateSerializerFactory(codeProvider, options, serializerFactoryClassTypeInfo, mavLink.Messages, serializationOutputPath, messageTypeEnumTypeInfo, serializerInterfaceTypeInfo);

            GenerateMessageFactory(codeProvider, options, messageFactoryClassTypeInfo, mavLink.Messages, messagesPath, messageTypeEnumTypeInfo, messageInterfaceTypeInfo);
        }
示例#9
0
        private static void GenerateSerializerClassFile(SerializerGenerationParams pParams, Message message, CodeGeneratorOptions options, CodeDomProvider codeProvider)
        {
            string serializerClassName = NameHelper.GetSerializerClassName(message);

            TypeInfo typeInfo = new TypeInfo()
            {
                Name      = serializerClassName,
                Namespace = pParams.Namespace
            };

            string          filename = TypeInfoHelper.GetFilename(typeInfo);
            String          filePath = Path.Combine(pParams.OutputPath, filename);
            CodeCompileUnit unit     = SerializerGeneratorHelper.CreateCodeCompileUnit(typeInfo, message, pParams.SerializerInterfaceTypeInfo, pParams.BaseClassTypeInfo, pParams.MessagesNamespace);

            codeProvider.GenerateCodeFromCompileUnit(unit, options, filePath);
        }