using System; using System.CommandLine; using System.CommandLine.Invocation; using System.Globalization; using System.IO; using System.Reflection; using System.Text; using System.Text.Json; using System.Threading; namespace ESPServer { class Program { static JsonDocument config; static UnitsDatabase db; static RegistersContainer registers; static void Main(string[] args) { CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; config = LoadConfig(); Logging.Setup(); db = new UnitsDatabase(config.RootElement.GetProperty("units")); registers = new RegistersContainer(); var rootCommand = new RootCommand(); var runCommand = new Command("run") { }; runCommand.Handler = CommandHandler.Create(RunService); rootCommand.AddCommand(runCommand); var openhabConfigCommand = new Command("openhab-config") { }; openhabConfigCommand.Handler = CommandHandler.Create(GenerateOpenhabConfig); rootCommand.AddCommand(openhabConfigCommand); rootCommand.InvokeAsync(args).Wait(); } private static void GenerateOpenhabConfig(string obj) { var root = config.RootElement; StringBuilder thingsConfig = new StringBuilder(); StringBuilder itemsConfig = new StringBuilder(); thingsConfig.AppendFormat("Bridge modbus:tcp:{0} [ host=\"{1}\", port={2}, id=1 ] {{\n", "esp_server", root.GetProperty("IP").GetString(), root.GetProperty("modbusPort").GetInt32()); // db.GenerateThingsConfig(thingsConfig); db.GenerateItemsConfig(itemsConfig); // thingsConfig.Append("}\n"); File.WriteAllText("esp_server.things", thingsConfig.ToString()); File.WriteAllText("esp_server.items", itemsConfig.ToString()); } private static void RunService(string obj) { var unitReceiver = new UnitDataReceiver(config.RootElement.GetProperty("port").GetInt32(), db, registers); unitReceiver.Start(); var unitPinger = new UnitPinger(db); unitPinger.Start(); var modbusServer = new ModbusServer(registers); modbusServer.Port = config.RootElement.GetProperty("modbusPort").GetInt32(); modbusServer.Run(); } private static JsonDocument LoadConfig() { string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var config = Path.Combine(assemblyFolder, "esp_server.json"); string configStr = File.ReadAllText(config); return JsonDocument.Parse(configStr); } } }