From 666d757ff60b922001260f0a65350fc5e250292a Mon Sep 17 00:00:00 2001 From: Wickedness Date: Thu, 9 Apr 2026 17:49:31 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A4=91=EA=B0=84=20=EA=B3=BC=EC=A0=95=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=ED=9B=84=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SYSTEM_SPEC.md | 55 ++- .../Controls/ChannelSchedulePanel.xaml | 92 +++- .../Controls/ChannelSchedulePanel.xaml.cs | 135 ++++++ .../Domain/ChannelScheduleItem.cs | 19 +- .../Domain/FormatTemplateDefinition.cs | 16 + Tornado3_2026Election/MainWindow.xaml | 328 +++++++------ Tornado3_2026Election/Persistence/AppState.cs | 5 +- .../Services/ChannelScheduleEngine.cs | 46 +- .../Services/FormatCatalogService.cs | 282 ++++++++--- .../Services/ITornado3Adapter.cs | 10 + .../Services/KarismaEventHandler.cs | 267 +++++++++++ .../Services/KarismaTornado3Adapter.cs | 393 ++++++++++++++++ .../Services/MockTornado3Adapter.cs | 10 + .../Services/TornadoManager.cs | 443 ++++++++++++++++++ .../Tornado3_2026Election.csproj | 17 +- .../ViewModels/ChannelScheduleViewModel.cs | 98 +++- .../ViewModels/DataViewModel.cs | 3 +- .../ViewModels/MainViewModel.cs | 80 +++- .../ViewModels/SettingsViewModel.cs | 5 +- 19 files changed, 2026 insertions(+), 278 deletions(-) create mode 100644 Tornado3_2026Election/Services/KarismaEventHandler.cs create mode 100644 Tornado3_2026Election/Services/KarismaTornado3Adapter.cs create mode 100644 Tornado3_2026Election/Services/TornadoManager.cs diff --git a/SYSTEM_SPEC.md b/SYSTEM_SPEC.md index eef127f..7f2cbfb 100644 --- a/SYSTEM_SPEC.md +++ b/SYSTEM_SPEC.md @@ -225,4 +225,57 @@ IDLE → READY → SENDING → ON_AIR → NEXT - 포맷 기반 - 컷 단위 송출 - 스케줄 큐 구조 -- 상태 머신 기반 제어 \ No newline at end of file +- 상태 머신 기반 제어 +--- + +## 15. 인코딩 검증 규칙 + +- 한글 문자열이 포함된 파일을 수정한 뒤에는 반드시 인코딩 깨짐 여부를 다시 확인한다. +- UI 문구, 로그 문구, 기본값 문자열은 저장 직후 한글이 정상 표시되는지 우선 점검한다. +- `?`, `�`, 비정상 한자 형태의 모지바케가 보이면 즉시 수정 대상으로 간주한다. +- 텍스트 파일은 UTF-8 기준으로 관리한다. +--- + +## 16. Karisma / Tornado3 연동 기준 + +- CG 연동 라이브러리는 `Interop.KAsyncEngineLib.dll`을 사용한다. +- 기본 접속 대상은 `127.0.0.1:30001`이다. +- `TORNADO_KARISMA_HOST`가 있으면 기본 호스트 대신 사용한다. +- `TORNADO_KARISMA_PORT`가 있으면 기본 포트 대신 사용한다. +- 앱 시작 시 `T3_Cut 경로`가 유효하지 않으면 실CG 대신 Mock Adapter로 폴백한다. +- 현재 구현 기준으로는 시작 시 Mock으로 결정된 경우, 설정 변경 후 실CG 재연결을 위해 앱 재시작이 필요할 수 있다. +- 채널 기본 바인딩은 `노멀=0:0`, `좌상단=0:1`, `하단=0:2`, `비디오월=1:0`이다. +- 환경변수 `TORNADO_KARISMA_BIND_NORMAL`, `TORNADO_KARISMA_BIND_TOPLEFT`, `TORNADO_KARISMA_BIND_BOTTOM`, `TORNADO_KARISMA_BIND_VIDEOWALL`로 채널 바인딩을 덮어쓸 수 있다. + +## 17. T3_Cut 운영 규칙 + +- 사용자 설정 명칭은 `이미지 루트 경로`가 아니라 `T3_Cut 경로`로 표기한다. +- 송출에 사용하는 컷 파일 확장자는 `.tscn`이다. +- 컷 파일은 `T3_Cut` 루트 아래의 고정된 포맷 구조를 기준으로 사용한다. +- 포맷 목록은 폴더 스캔으로 동적 생성하지 않고 하드코딩된 목록으로 관리한다. +- 같은 컷 이름에 `_loop.tscn` 파일이 있으면 반복 송출 컷으로 사용한다. +- 최초 송출 시에는 기본 컷 파일을 사용한다. +- 이미 송출 중인 상태에서 같은 컷을 다시 사용할 때는 `_loop.tscn`이 있으면 우선 사용한다. +- `_loop.tscn`이 없으면 기본 `.tscn` 파일로 폴백한다. +- 예시: `1-2위_광역단체장.tscn`은 최초 송출용, `1-2위_광역단체장_loop.tscn`은 반복 송출용으로 간주한다. + +## 18. CG 연동 상태 UI 표기 기준 + +- 메인 화면 상단에는 `CG 연동 상태`를 표시한다. +- 사용자는 UI에서 현재 어댑터가 `실CG`인지 `Mock`인지 즉시 식별할 수 있어야 한다. +- 상단 상태 영역에는 실CG 연동 여부, 연결 대상, 채널 정상 상태 요약을 함께 표시한다. +- 채널 패널별로도 해당 채널이 어떤 백엔드를 사용하는지 표시한다. +- 실제 Karisma 사용 시 연결 대상 예시는 `127.0.0.1:30001` 형식으로 표시한다. + +## 19. CG Return Value / Callback 로그 정책 + +- CG 시스템으로부터 오는 Return Value 관련 결과는 `로그` 탭에서 확인할 수 있어야 한다. +- 즉시 반환되는 값과 비동기 콜백 결과를 모두 로그로 남긴다. +- `Connect()` 호출 직후의 반환값은 즉시 로그로 기록한다. +- `LoadScene()` 및 `LoadSceneForce()` 호출 결과도 즉시 로그로 기록한다. +- `KAEventHandler` 기반 콜백 결과를 `LogService`를 통해 공용 로그에 남긴다. +- 로그에는 콜백 이름, 결과 enum 이름, 숫자 코드, 추가 정보(scene, object, output, layer 등)를 함께 남긴다. +- `OnConnect(int ErrorCode)`는 `0`을 성공으로 간주하고, `0`이 아닌 값은 실패로 기록한다. +- `eKResult.RESULT_SUCCESS`는 정보 로그로 남기고, 그 외 결과는 경고 로그로 남긴다. +- 현재 로깅 대상에는 `OnConnect`, `OnClose`, `OnLogMessage`, `OnMessageNo`, `OnLoadScene`, `OnLoadSceneForce`, `OnBeginTransaction`, `OnEndTransaction`, `OnHeartBeat`, `OnSetValue`, `OnScenePrepare`, `OnScenePrepareEx`, `OnPlay`, `OnPlayOut`, `OnPause`, `OnResume`, `OnStop`, `OnStopAll`, `OnCutIn`, `OnCutOut`, `OnTrigger`, `OnTriggerObject`, `OnQueryIsOnAir`, `OnQueryLayerCount`, `OnScenePlayingStarted`, `OnScenePlayed`, `OnSceneAnimationPlayed`, `OnScenePaused`를 포함한다. +- CG 콜백 로그와 앱 내부 로그는 같은 로그 시스템에 합쳐서 표시한다. \ No newline at end of file diff --git a/Tornado3_2026Election/Controls/ChannelSchedulePanel.xaml b/Tornado3_2026Election/Controls/ChannelSchedulePanel.xaml index c77f1c9..df94453 100644 --- a/Tornado3_2026Election/Controls/ChannelSchedulePanel.xaml +++ b/Tornado3_2026Election/Controls/ChannelSchedulePanel.xaml @@ -1,4 +1,4 @@ - + - + Content="?" + FontFamily="Bahnschrift SemiBold" + FontSize="11"> + + + + + + + + Text="실행 순서" /> + + + + + + @@ -267,11 +315,11 @@ CornerRadius="12"> + Text="{x:Bind StateLabel, Mode=OneWay}" /> + Text="{x:Bind LastPlayedLabel, Mode=OneWay}" /> @@ -286,8 +334,7 @@ - - + @@ -299,24 +346,20 @@ Spacing="8" VerticalAlignment="Center"> + + + + + + + + + + + + + + + @@ -195,8 +208,7 @@ - - + @@ -205,8 +217,7 @@ - - + @@ -214,22 +225,13 @@ - - + + + @@ -353,7 +374,7 @@ SelectedValue="{Binding ManualJudgement, Mode=TwoWay}" SelectedValuePath="Value" /> - + + + + - - + @@ -420,7 +480,7 @@ - + @@ -428,8 +488,7 @@ - - + @@ -476,7 +535,7 @@ - +