using DibdProtocol.Transport; namespace Dabit.Mcp.Config; /// /// MCP 서버가 붙을 전광판 연결 설정. 환경변수(DABIT_*)에서 읽는다. /// Claude Desktop이 claude_desktop_config.json의 env로 주입하는 것을 기본으로 한다 /// (서버 프로세스의 작업 디렉터리가 불확실하므로 파일보다 환경변수가 견고). /// public sealed record McpConnectionSettings { public TransportType ConnectType { get; init; } = TransportType.TcpClient; public string PortName { get; init; } = "COM1"; public int BaudRate { get; init; } = 9600; public string Host { get; init; } = "192.168.0.201"; public int Port { get; init; } = 5000; public int ResponseLatencyMs { get; init; } = 1000; /// 환경변수에서 설정을 읽는다. 누락 항목은 기본값. public static McpConnectionSettings FromEnvironment() { static string? Env(string key) => Environment.GetEnvironmentVariable(key); var transport = (Env("DABIT_TRANSPORT") ?? "").Trim().ToLowerInvariant() switch { "serial" => TransportType.Serial, "tcp" or "tcpclient" => TransportType.TcpClient, _ => TransportType.TcpClient, }; return new McpConnectionSettings { ConnectType = transport, PortName = Env("DABIT_COM") ?? "COM1", BaudRate = int.TryParse(Env("DABIT_BAUD"), out var b) ? b : 9600, Host = Env("DABIT_HOST") ?? "192.168.0.201", Port = int.TryParse(Env("DABIT_PORT"), out var p) ? p : 5000, ResponseLatencyMs = int.TryParse(Env("DABIT_RESPONSE_LATENCY"), out var r) ? r : 1000, }; } /// 사람이 읽을 연결 요약 문자열. public string Describe() => ConnectType == TransportType.Serial ? $"Serial {PortName} @ {BaudRate}bps (timeout {ResponseLatencyMs}ms)" : $"TcpClient {Host}:{Port} (timeout {ResponseLatencyMs}ms)"; }