|
| 1 | +using System.Dynamic; |
| 2 | +using System.Text; |
| 3 | +using YamlDotNet.Core; |
| 4 | +using YamlDotNet.Serialization; |
| 5 | + |
| 6 | +var fileName = args[0]; |
| 7 | +var yaml = File.ReadAllText(fileName); |
| 8 | +var deserializer = new Deserializer(); |
| 9 | +var parser = new MergingParser(new Parser(new StringReader(yaml))); |
| 10 | +dynamic deviceModel = deserializer.Deserialize<ExpandoObject>(parser); |
| 11 | + |
| 12 | +var builder = new StringBuilder(); |
| 13 | +builder.AppendLine($@"--- |
| 14 | +uid: Harp.{deviceModel.device}.Device |
| 15 | +--- |
| 16 | +
|
| 17 | +<table> |
| 18 | + <thead> |
| 19 | + <tr><th colspan=""2"">{deviceModel.device}</th></tr> |
| 20 | + </thead> |
| 21 | + <tbody> |
| 22 | + <tr><td>whoAmI</td><td>{deviceModel.whoAmI}</td></tr> |
| 23 | + <tr><td>firmwareVersion</td><td>{deviceModel.firmwareVersion}</td></tr> |
| 24 | + <tr><td>hardwareTargets</td><td>{deviceModel.hardwareTargets}</td></tr> |
| 25 | + </tbody> |
| 26 | +</table> |
| 27 | +
|
| 28 | +### Registers |
| 29 | +
|
| 30 | +| name | address | type | length | access | description | range | interfaceType | |
| 31 | +|-|-|-|-|-|-|-|-|"); |
| 32 | +foreach (var item in deviceModel.registers) |
| 33 | +{ |
| 34 | + if (item.Value.TryGetValue("visibility", out object visibility) && |
| 35 | + (string)visibility == "private") |
| 36 | + { |
| 37 | + continue; |
| 38 | + } |
| 39 | + |
| 40 | + var name = item.Key; |
| 41 | + var register = ExpandoHelper.FromDictionary(item.Value, |
| 42 | + "length", |
| 43 | + "description", |
| 44 | + "minValue", |
| 45 | + "maxValue", |
| 46 | + "defaultValue", |
| 47 | + "payloadSpec", |
| 48 | + "maskType", |
| 49 | + "interfaceType"); |
| 50 | + var interfaceType = register.maskType |
| 51 | + ?? register.interfaceType |
| 52 | + ?? (register.payloadSpec != null ? $"{name}Payload" : null); |
| 53 | + var interfaceTypeRef = (string)interfaceType == "EnableFlag" |
| 54 | + ? "Bonsai.Harp.EnableFlag" |
| 55 | + : $"Harp.{deviceModel.device}.{interfaceType}"; |
| 56 | + |
| 57 | + var access = register.access; |
| 58 | + if (access is List<object> accessList) |
| 59 | + { |
| 60 | + access = string.Join(", ", accessList); |
| 61 | + } |
| 62 | + |
| 63 | + var range = ""; |
| 64 | + if (register.minValue != null || register.maxValue != null) |
| 65 | + { |
| 66 | + range = $"[{register.minValue}:{register.maxValue}]"; |
| 67 | + } |
| 68 | + if (register.defaultValue != null) range = $"{register.defaultValue} {range}"; |
| 69 | + |
| 70 | + builder.AppendLine( |
| 71 | + $"| [{name}](xref:Harp.{deviceModel.device}.{name}) " + |
| 72 | + $"| {register.address} " + |
| 73 | + $"| {register.type} " + |
| 74 | + $"| {register.length} " + |
| 75 | + $"| {access} " + |
| 76 | + $"| {register.description} " + |
| 77 | + $"| {range} " + |
| 78 | + (interfaceType != null ? $"| [{interfaceType}](xref:{interfaceTypeRef}) |" : "| |")); |
| 79 | +} |
| 80 | + |
| 81 | +var output = builder.ToString(); |
| 82 | +if (args.Length > 1) |
| 83 | +{ |
| 84 | + File.WriteAllText(Path.Combine(args[1], $"Harp_{deviceModel.device}_Device.md"), output); |
| 85 | + File.WriteAllText(Path.Combine(args[1], $"Harp_{deviceModel.device}.md"), $@"--- |
| 86 | +uid: Harp.{deviceModel.device} |
| 87 | +--- |
| 88 | +
|
| 89 | +[!include[README](~/src/device.{deviceModel.device.ToLowerInvariant()}/README.md)] |
| 90 | +
|
| 91 | +[!include[RegisterTables](./Harp_{deviceModel.device}_Device.md)]"); |
| 92 | +} |
| 93 | +else Console.WriteLine(output); |
0 commit comments