Files
heat_control/esp_server/Program.cs
T

81 lines
2.5 KiB
C#

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<string>(RunService);
rootCommand.AddCommand(runCommand);
var openhabConfigCommand = new Command("openhab-config")
{
};
openhabConfigCommand.Handler = CommandHandler.Create<string>(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();
// initialize data writer (do not need to save it as it will react on events by itself)
new UnitDataWriter(db, registers);
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);
}
}
}