コード例 #1
0
        public async Task <string> DownloadSchema(CancellationToken cancellationToken = default(CancellationToken), bool setSchemaChecksum = true)
        {
            AssertNotDisposed();
            AssertConnected();

            var schemaTimeoutPolicy = Policy.TimeoutAsync(timeout: TimeSpan.FromSeconds(30), timeoutStrategy: Polly.Timeout.TimeoutStrategy.Optimistic);

            byte[] schemaBytes = await deviceConnection.RequestBuffer(cancellationToken, schemaTimeoutPolicy).ConfigureAwait(false);

            if (setSchemaChecksum)
            {
                var schemaChecksum = SchemaChecksumCalculator.CalculateChecksum(schemaBytes);
                SchemaChecksum = schemaChecksum;
                deviceConnection.SchemaChecksum = schemaChecksum;
            }

            var schemaJson = System.Text.Encoding.UTF8.GetString(schemaBytes, 0, schemaBytes.Length);

            return(schemaJson);
        }
コード例 #2
0
        public static GenerationResult GenerateFromString(string schemaJson)
        {
            var schemaBytes    = Encoding.ASCII.GetBytes(schemaJson);
            var schemaBase64   = Convert.ToBase64String(schemaBytes);
            var schemaChecksum = SchemaChecksumCalculator.CalculateChecksum(schemaBytes);

            var codeClasses = SchemaParser.Parse(schemaJson);

            var namespaceDeclaration = NamespaceDeclaration(ParseName("ODriveClientLibrary.DeviceSchema"))
                                       .AddUsings(
                UsingDirective(ParseName("System")),
                UsingDirective(ParseName("System.Threading.Tasks")),
                UsingDirective(ParseName("ODriveClientLibrary.Common")),
                UsingDirective(ParseName("ODriveClientLibrary.DeviceSchema"))
                );

            var alreadyGeneratedClassNames = new List <string>();

            codeClasses.ForEach(codeClass =>
            {
                // Don't generate duplicate classes - e.g. Axis0.Something as well as Axis1.Something
                // The class name is prefixed with the parent object's type, which work for now in
                // making actual unique types have unique names.
                if (!alreadyGeneratedClassNames.Contains(codeClass.ClassName))
                {
                    var classDeclaration = Generators.CodeClassGenerator.Generate(codeClass, schemaChecksum);
                    namespaceDeclaration = namespaceDeclaration.AddMembers(classDeclaration);
                    alreadyGeneratedClassNames.Add(codeClass.ClassName);
                }
            });

            //var firmwareVersionProperties = codeClasses
            //    .ToList()
            //    .SelectMany(item => item.ScalarProperties)
            //    .Where(item => item.Name.StartsWith("FwVersion"))
            //    .ToList();

            //byte? majorVersion = null;
            //byte? minorVersion = null;
            //byte? revisionVersion = null;
            //byte? unreleasedVersion = null;

            //if (firmwareVersionProperties.Count >= 4)
            //{
            //    var majorEndpointID = firmwareVersionProperties.Find(item => item.Name == "FwVersionMajor").EndpointID.Value;
            //    var minorEndpointID = firmwareVersionProperties.Find(item => item.Name == "FwVersionMinor").EndpointID.Value;
            //    var revisionEndpointID = firmwareVersionProperties.Find(item => item.Name == "FwVersionRevision").EndpointID.Value;
            //    var unreleasedEndpointID = firmwareVersionProperties.Find(item => item.Name == "FwVersionUnreleased").EndpointID.Value;

            //    majorVersion = oDrive.FetchEndpoint<byte>((ushort)majorEndpointID).Result;
            //    minorVersion = oDrive.FetchEndpoint<byte>((ushort)minorEndpointID).Result;
            //    revisionVersion = oDrive.FetchEndpoint<byte>((ushort)revisionEndpointID).Result;
            //    unreleasedVersion = oDrive.FetchEndpoint<byte>((ushort)unreleasedEndpointID).Result;
            //}


            var code = ((SyntaxNode)namespaceDeclaration).NormalizeWhitespace().ToFullString();

            var generationResult = new GenerationResult(code);

            return(generationResult);
        }