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); }
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); }