using System.ComponentModel; using Dabit.Mcp.Services; using DibdProtocol.Protocol; using Microsoft.Extensions.Logging; using ModelContextProtocol.Server; namespace Dabit.Mcp.Tools; /// 페이지 메시지 개수·초기화·섹션 효과 도구. ⚠️ 쓰기. [McpServerToolType] public sealed class PageTools { private readonly LedControlService _led; private readonly ILogger _log; public PageTools(LedControlService led, ILogger log) { _led = led; _log = log; } [McpServerTool] [Description("페이지 메시지 개수를 설정한다. ⚠️ 쓰기·설정 저장. count 1~10.")] public async Task SetPageCount( [Description("페이지 수 1~10")] int count, CancellationToken ct = default) { if (count < 1 || count > 10) return "페이지 수는 1~10이어야 합니다."; var resp = await _led.SendAsciiAsync("60", count.ToString("D2"), ct, 5000); return Format(resp, $"페이지 개수 {count}개 설정."); } [McpServerTool] [Description("페이지 메시지를 초기화(삭제)한다. ⚠️ 쓰기. page: 0=전체 삭제, 1~10=개별 페이지.")] public async Task ResetPageMessage( [Description("0=전체 삭제, 1~10=개별 페이지")] int page, CancellationToken ct = default) { if (page < 0 || page > 10) return "page는 0(전체)~10이어야 합니다."; // 정본: 전체→"99", 개별 N(1~10)→(N-1) zero-pad 2자리 var data = page == 0 ? "99" : (page - 1).ToString("D2"); var resp = await _led.SendAsciiAsync("61", data, ct, 5000); return Format(resp, page == 0 ? "전체 페이지 초기화." : $"{page}번 페이지 초기화."); } [McpServerTool] [Description("섹션별 표출 효과 모드를 설정한다. ⚠️ 쓰기. mode: 0=동시표출, 1=개별표출.")] public async Task SetSectionEffect( [Description("0=동시표출, 1=개별표출")] int mode, CancellationToken ct = default) { // 정본: N=동시표출, Y=개별표출 var data = mode == 0 ? "N" : "Y"; var resp = await _led.SendAsciiAsync("62", data, ct, 5000); return Format(resp, mode == 0 ? "섹션 동시표출 설정." : "섹션 개별표출 설정."); } private static string Format(DibdProtocol.Protocol.AsciiParsedResponse? r, string ok) => r is null ? "전송 실패 — 연결 또는 통신 오류." : (r.Result == "F" ? "전광판이 거부했습니다 (Result=F)." : ok); }