using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Json; namespace Tools.JsonToXlsHelper { public class registerGruppe { public string Name { get; set; } public int Adresse { get; set; } public List Register = new List(); } public class RegisterS { public string name { get; set; } public int Adresse { get; set; } public string type { get; set; } public Privilege privilege { get; set; } public int first { get; set; } public int last { get; set; } public string Description { get; internal set; } public Int64? Vdefault { get; internal set; } public Int64? Vminimum { get; internal set; } public Int64? Vmaximum { get; internal set; } } class Program { static void Main(string[] args) { { var configfile = Path.Combine("C:\\GenesisLog\\", "configuration.json"); if (!File.Exists(configfile)) { throw new ApplicationException($"Configuration file {configfile} not found "); } var tr = new StreamReader(configfile); var text = tr.ReadToEnd(); dynamic stuff = JObject.Parse(text); var s = stuff.First; var a = ((JObject)(stuff)).Children(); var allReg = new List(); foreach (var item in a) { var grpname = item.Path; var grpID = ((JValue)item.First.First.First); var registers = item.First.Children()["registers"]; var AddRegGrp = new registerGruppe(); AddRegGrp.Name = grpname; var t = 0; int.TryParse(grpID.Value.ToString(), out t); AddRegGrp.Adresse = t; AddRegGrp.Register = new List(); foreach (var itemregist in registers.Children()) { var registerName = ((JProperty)itemregist).Name; var registerAdresse = ((JValue)itemregist.First.First.Values().First()).Value; var registerAdd = new RegisterS(); registerAdd.name = registerName; int.TryParse(registerAdresse.ToString(), out t); registerAdd.Adresse = t; registerAdd.privilege = new Privilege(); var registerdetails = itemregist.First.Last.First.First; foreach (var registerdetailsitem in registerdetails.Children()) { var detailName = ((JProperty)registerdetailsitem).Name.ToLower(); var detailValue = ((JProperty)registerdetailsitem).Value; switch (detailName) { case "values": foreach (JProperty detailValues in detailValue.Children()) { Int64 ta = 0; Int64.TryParse(detailValues.Value.ToString(), out ta); switch (detailValues.Name) { case "default": registerAdd.Vdefault = ta; break; case "maximum": registerAdd.Vmaximum = ta; break; case "minimum": registerAdd.Vminimum = ta; break; default: break; } } break; case "version": var first = (int?)((JProperty)detailValue.First).Value; registerAdd.first = first.HasValue ? first.Value : 0; var last = (int?)((JProperty)detailValue.Last).Value; registerAdd.last = last.HasValue ? last.Value : 0; break; case "description": registerAdd.Description = detailValue.ToString(); break; case "type": registerAdd.type = detailValue.ToString(); break; case "privilege": foreach (var privilegeitem in detailValue.Children()) { var accessValue = Access.NS; switch (((JProperty)privilegeitem).Value.ToString().ToUpper()) { case "RO": accessValue = Access.RO; break; case "RW": accessValue = Access.RW; break; case "WO": accessValue = Access.WO; break; case "NA": accessValue = Access.NA; break; } switch (((JProperty)privilegeitem).Name) { case "lvl1": registerAdd.privilege.Lvl1 = accessValue; break; case "lvl2": registerAdd.privilege.Lvl2 = accessValue; break; case "lvl3": registerAdd.privilege.Lvl3 = accessValue; break; case "lvl4": registerAdd.privilege.Lvl4 = accessValue; break; case "lvl5": registerAdd.privilege.Lvl5 = accessValue; break; case "lvl6": registerAdd.privilege.Lvl6 = accessValue; break; case "lvl7": registerAdd.privilege.Lvl7 = accessValue; break; case "lvl8": registerAdd.privilege.Lvl8 = accessValue; break; } } break; default: break; } } AddRegGrp.Register.Add(registerAdd); } allReg.Add(AddRegGrp); } StringBuilder sbCode = new StringBuilder(); foreach (var item in allReg) { sbCode.AppendLine($"public static class {item.Name}");//System sbCode.AppendLine("{"); sbCode.AppendLine($"private const Byte RegisterAdress = 0x{item.Adresse.ToString("X2")}; "); foreach (var reg in item.Register) { sbCode.Append($"public static readonly RegisterDefinition "); sbCode.Append($" {reg.name} "); sbCode.Append(" = new RegisterDefinition"); sbCode.Append(" { "); //default min max sbCode.Append($" DataType = typeof({getStatusText(reg.type)}), "); sbCode.Append($" Adress = new Byte[] {{ RegisterAdress,0x{reg.Adresse.ToString("X2")} }} ,"); sbCode.Append($" Default = {reg.Vdefault},"); sbCode.Append($" Maximum = {reg.Vmaximum},"); sbCode.Append($" Minimum = {reg.Vminimum},"); sbCode.Append($"detail = new Detail(){{"); sbCode.Append($" description = \"{reg.Description}\" ,"); sbCode.Append($" version = new Version({reg.first},{reg.last}) ,"); sbCode.Append($" privilege = new RegisterPrivilege {{ Lvl1 = Access.{getLVLText(reg.privilege.Lvl1)},Lvl2 = Access.{getLVLText(reg.privilege.Lvl2)}, Lvl3 = Access.{getLVLText(reg.privilege.Lvl3)}, Lvl4 = Access.{getLVLText(reg.privilege.Lvl4)}, Lvl5 = Access.{getLVLText(reg.privilege.Lvl5)}, Lvl6 = Access.{getLVLText(reg.privilege.Lvl6)}, Lvl7 = Access.{getLVLText(reg.privilege.Lvl7)}, Lvl8 = Access.{getLVLText(reg.privilege.Lvl8)} }}"); sbCode.Append($"}}"); sbCode.AppendLine("};");// } sbCode.AppendLine("};");// } var textsb = sbCode.ToString(); Console.Write(textsb); StringBuilder sbCsv = new StringBuilder(); char sep = ';'; sbCsv.Append("Gruppe").Append(sep); sbCsv.Append("Name").Append(sep); sbCsv.Append("Adresse").Append(sep); sbCsv.Append("Type").Append(sep); sbCsv.Append("Beschreibung").Append(sep); sbCsv.Append("Default").Append(sep); sbCsv.Append("Min").Append(sep); sbCsv.Append("Max").Append(sep); sbCsv.Append("Ab Version").Append(sep); sbCsv.Append("Bis Version").Append(sep); sbCsv.Append("lvl1").Append(sep); sbCsv.Append("lvl2").Append(sep); sbCsv.Append("lvl3").Append(sep); sbCsv.Append("lvl4").Append(sep); sbCsv.Append("lvl5").Append(sep); sbCsv.Append("lvl6").Append(sep); sbCsv.Append("lvl7").Append(sep); sbCsv.Append("lvl8").Append(sep); sbCsv.AppendLine(); foreach (var item in allReg) { foreach (var reg in item.Register) { sbCsv.Append(item.Name).Append(sep); sbCsv.Append(reg.name).Append(sep); sbCsv.Append($"0x{ item.Adresse.ToString("X2") } , 0x{ reg.Adresse.ToString("X2")}").Append(sep); sbCsv.Append(getStatusText(reg.type)).Append(sep); sbCsv.Append(reg.Description).Append(sep); sbCsv.Append(reg.Vdefault.HasValue ? reg.Vdefault.Value.ToString() : "-" ).Append(sep); sbCsv.Append(reg.Vminimum.HasValue ? reg.Vminimum.Value.ToString() : "-").Append(sep); sbCsv.Append(reg.Vmaximum.HasValue ? reg.Vmaximum.Value.ToString() : "-").Append(sep); sbCsv.Append(reg.first).Append(sep); sbCsv.Append(reg.last).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl1)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl2)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl3)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl4)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl5)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl6)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl7)).Append(sep); sbCsv.Append(getLVLText(reg.privilege.Lvl8)).Append(sep); sbCsv.AppendLine(); } } textsb = sbCsv.ToString(); Console.Write(textsb); } } static string getStatusText(string fileText) { switch (fileText.ToLower()) { case "uint64_t": return "UInt64"; case "uint32_t": return "UInt32"; case "uint16_t": return "UInt16"; case "uint8_t": return "byte"; case "int64_t": return "Int64"; case "int32_t": return "Int32"; case "int16_t": return "Int16"; case "int8_t": return "sbyte"; case "uint96_t": return "string"; case "rpc": return "Rpc"; case "string": return "string"; case "bool_t": return "bool"; case "time_t": return "TimeT"; case "status_t": return "StatusT"; case "enum8": return "Enum8"; } return "implement!" + fileText; } static string getLVLText(Access a) { switch (a) { case Access.NA: return "Na"; case Access.RO: return "Ro"; case Access.WO: return "Wo"; case Access.RW: return "Rw"; default: return "NotSet"; } } } }