Browse Source

fix: 기능수정

main
최승민 2 months ago
parent
commit
d14adcd328
  1. BIN
      ADLINK.zip
  2. 0
      ADLINK/PCIS-DASK/pdf/DASK Installation Guide.pdf
  3. 0
      ADLINK/PCIS-DASK/pdf/PCIS-DASK Function Reference.pdf
  4. 0
      ADLINK/PCIS-DASK/pdf/PCIS-DASK User Manual.pdf
  5. 83
      DB/dbo.EOL_Schema.sql
  6. 131
      README.md
  7. 71
      StartupLoginWindow.xaml.cs
  8. BIN
      docs/NE1aW 온압센서 공정 시방서 및 Tooling 개발 계획_Rev.0_26.05.22 -모비다임 송부.pdf
  9. BIN
      docs/★NE1aW 온압센서 DB Specification_Rev.01_26.05.25.xlsx
  10. 104
      leak_test_project.Tests/Services/Board4251ServiceTests.cs
  11. 30
      leak_test_project.Tests/Utils/SentinelCrc8Tests.cs
  12. 149
      leak_test_project.Tests/Utils/SentinelParserTests.cs
  13. BIN
      leak_test_project.Tests/bin/Debug/net472/Castle.Core.dll
  14. 2
      leak_test_project.Tests/bin/Debug/net472/Logs/2026-04-08_system.log
  15. 25
      leak_test_project.Tests/bin/Debug/net472/Logs/2026-04-24_system.log
  16. BIN
      leak_test_project.Tests/bin/Debug/net472/Microsoft.TestPlatform.CoreUtilities.dll
  17. BIN
      leak_test_project.Tests/bin/Debug/net472/Microsoft.TestPlatform.PlatformAbstractions.dll
  18. BIN
      leak_test_project.Tests/bin/Debug/net472/Microsoft.VisualStudio.CodeCoverage.Shim.dll
  19. BIN
      leak_test_project.Tests/bin/Debug/net472/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll
  20. BIN
      leak_test_project.Tests/bin/Debug/net472/Moq.dll
  21. BIN
      leak_test_project.Tests/bin/Debug/net472/NuGet.Frameworks.dll
  22. BIN
      leak_test_project.Tests/bin/Debug/net472/System.Collections.Immutable.dll
  23. BIN
      leak_test_project.Tests/bin/Debug/net472/System.Reflection.Metadata.dll
  24. BIN
      leak_test_project.Tests/bin/Debug/net472/System.Runtime.CompilerServices.Unsafe.dll
  25. BIN
      leak_test_project.Tests/bin/Debug/net472/System.Threading.Tasks.Extensions.dll
  26. BIN
      leak_test_project.Tests/bin/Debug/net472/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll
  27. BIN
      leak_test_project.Tests/bin/Debug/net472/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  28. BIN
      leak_test_project.Tests/bin/Debug/net472/de/Microsoft.TestPlatform.CoreUtilities.resources.dll
  29. BIN
      leak_test_project.Tests/bin/Debug/net472/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  30. BIN
      leak_test_project.Tests/bin/Debug/net472/es/Microsoft.TestPlatform.CoreUtilities.resources.dll
  31. BIN
      leak_test_project.Tests/bin/Debug/net472/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  32. BIN
      leak_test_project.Tests/bin/Debug/net472/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll
  33. BIN
      leak_test_project.Tests/bin/Debug/net472/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  34. BIN
      leak_test_project.Tests/bin/Debug/net472/it/Microsoft.TestPlatform.CoreUtilities.resources.dll
  35. BIN
      leak_test_project.Tests/bin/Debug/net472/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  36. BIN
      leak_test_project.Tests/bin/Debug/net472/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll
  37. BIN
      leak_test_project.Tests/bin/Debug/net472/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  38. BIN
      leak_test_project.Tests/bin/Debug/net472/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll
  39. BIN
      leak_test_project.Tests/bin/Debug/net472/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  40. BIN
      leak_test_project.Tests/bin/Debug/net472/leak_test_project.Tests.dll
  41. BIN
      leak_test_project.Tests/bin/Debug/net472/leak_test_project.Tests.pdb
  42. BIN
      leak_test_project.Tests/bin/Debug/net472/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll
  43. BIN
      leak_test_project.Tests/bin/Debug/net472/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  44. BIN
      leak_test_project.Tests/bin/Debug/net472/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll
  45. BIN
      leak_test_project.Tests/bin/Debug/net472/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  46. BIN
      leak_test_project.Tests/bin/Debug/net472/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll
  47. BIN
      leak_test_project.Tests/bin/Debug/net472/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  48. BIN
      leak_test_project.Tests/bin/Debug/net472/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll
  49. BIN
      leak_test_project.Tests/bin/Debug/net472/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  50. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.abstractions.dll
  51. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.assert.dll
  52. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.core.dll
  53. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.execution.desktop.dll
  54. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.runner.reporters.net452.dll
  55. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.runner.utility.net452.dll
  56. BIN
      leak_test_project.Tests/bin/Debug/net472/xunit.runner.visualstudio.testadapter.dll
  57. BIN
      leak_test_project.Tests/bin/Debug/net472/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll
  58. BIN
      leak_test_project.Tests/bin/Debug/net472/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  59. BIN
      leak_test_project.Tests/bin/Debug/net472/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll
  60. BIN
      leak_test_project.Tests/bin/Debug/net472/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
  61. 10
      leak_test_project.Tests/bin/Release/net472/Logs/2026-04-24_system.log
  62. 47
      leak_test_project.Tests/leak_test_project.Tests.csproj
  63. 4
      leak_test_project.Tests/obj/Debug/net472/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
  64. 0
      leak_test_project.Tests/obj/Debug/net472/leak_tes.E02BB52F.Up2Date
  65. 23
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.AssemblyInfo.cs
  66. 1
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.AssemblyInfoInputs.cache
  67. 8
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.GeneratedMSBuildEditorConfig.editorconfig
  68. BIN
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.assets.cache
  69. BIN
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.AssemblyReference.cache
  70. 0
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.BuildWithSkipAnalyzers
  71. 1
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.CoreCompileInputs.cache
  72. 54
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.FileListAbsolute.txt
  73. BIN
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.dll
  74. BIN
      leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.pdb
  75. 4
      leak_test_project.Tests/obj/Release/net472/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
  76. 23
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.AssemblyInfo.cs
  77. 1
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.AssemblyInfoInputs.cache
  78. 8
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.GeneratedMSBuildEditorConfig.editorconfig
  79. BIN
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.assets.cache
  80. BIN
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.AssemblyReference.cache
  81. 0
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.BuildWithSkipAnalyzers
  82. 1
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.CoreCompileInputs.cache
  83. 54
      leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.FileListAbsolute.txt
  84. 86
      leak_test_project.Tests/obj/leak_test_project.Tests.csproj.nuget.dgspec.json
  85. 25
      leak_test_project.Tests/obj/leak_test_project.Tests.csproj.nuget.g.props
  86. 9
      leak_test_project.Tests/obj/leak_test_project.Tests.csproj.nuget.g.targets
  87. 1007
      leak_test_project.Tests/obj/project.assets.json
  88. 28
      leak_test_project.Tests/obj/project.nuget.cache
  89. 1
      leak_test_project.slnx
  90. 4
      leak_test_project/App.xaml
  91. 27
      leak_test_project/Infrastructure/DioBoardBase.cs
  92. 9
      leak_test_project/MainWindow.xaml
  93. 1
      leak_test_project/Manual/.obsidian/app.json
  94. 1
      leak_test_project/Manual/.obsidian/appearance.json
  95. 33
      leak_test_project/Manual/.obsidian/core-plugins.json
  96. 195
      leak_test_project/Manual/.obsidian/workspace.json
  97. 121
      leak_test_project/Manual/01_시스템_개요.md
  98. 135
      leak_test_project/Manual/02_초기_설정.md
  99. 180
      leak_test_project/Manual/03_메인_화면.md
  100. 67
      leak_test_project/Manual/04_통신_설정.md

BIN
ADLINK.zip

Binary file not shown.

0
ADLINK/PCIS-DASK/Manual/DASK Installation Guide.pdf → ADLINK/PCIS-DASK/pdf/DASK Installation Guide.pdf

0
ADLINK/PCIS-DASK/Manual/PCIS-DASK Function Reference.pdf → ADLINK/PCIS-DASK/pdf/PCIS-DASK Function Reference.pdf

0
ADLINK/PCIS-DASK/Manual/PCIS-DASK User Manual.pdf → ADLINK/PCIS-DASK/pdf/PCIS-DASK User Manual.pdf

83
DB/dbo.EOL_Schema.sql

@ -0,0 +1,83 @@
-- ============================================================================
-- Project: NE1aW 온압센서
-- Document: dbo.EOL Table Schema (Simplified Version)
-- Author: Antigravity AI
-- Date: 2026-05-28
-- Description: 사용자 요구사항(ID, 좌/우, SPEC UL, SPEC LL, 누설값, 판정)에 맞추어 단순화된 스키마.
-- 재검사 이력 추적을 위해 Seq(PK) 및 InspectDateTime(일시) 컬럼 추가.
-- ============================================================================
-- 1. 데이터베이스 존재 여부 확인 및 자동 생성
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'NE1aW_PT_SENSOR')
BEGIN
CREATE DATABASE [NE1aW_PT_SENSOR];
PRINT 'Database [NE1aW_PT_SENSOR] created successfully.';
END
GO
USE [NE1aW_PT_SENSOR];
GO
-- 2. 기존 테이블이 존재할 경우 삭제
IF OBJECT_ID('dbo.EOL', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.EOL;
PRINT 'Existing [dbo].[EOL] table dropped.';
END
GO
-- 3. 단순화된 테이블 생성
CREATE TABLE [dbo].[EOL] (
[InspectDate] NVARCHAR(10) NOT NULL, -- 검사 날짜 (YYYY-MM-DD)
[InspectTime] NVARCHAR(8) NOT NULL, -- 검사 시간 (HH:MM:SS)
[ID] NVARCHAR(30) NOT NULL, -- 센서 ID (ProductId) (기본키)
[Channel] NVARCHAR(10) NOT NULL, -- 좌 / 우 (LEFT / RIGHT)
[SpecUL] NVARCHAR(10) NOT NULL, -- SPEC UL
[SpecLL] NVARCHAR(10) NOT NULL, -- SPEC LL
[LeakValue] NVARCHAR(20) NOT NULL, -- 누설 측정값 (MeasuredValue)
[Result] NVARCHAR(5) NOT NULL, -- 판정 결과 (OK / NG)
CONSTRAINT [PK_EOL_ID] PRIMARY KEY CLUSTERED ([ID] ASC)
);
GO
PRINT 'Table [dbo].[EOL] created successfully with simplified columns and ID as Primary Key.';
GO
-- ============================================================================
-- [부록] 테스트 시나리오 SQL 예시 (단순화 버전)
-- ============================================================================
/*
-- 1. 테스트용 기본 데이터 INSERT (정상 삽입)
INSERT INTO [dbo].[EOL] (
[InspectDate], [InspectTime], [ID], [Channel], [SpecUL], [SpecLL], [LeakValue], [Result]
)
VALUES (
'2026-06-02', '14:48:51', 'IC_SIMPLE_0001', 'LEFT', '1.00', '-1.00', '0.125', 'OK'
);
-- 데이터 확인
SELECT * FROM [dbo].[EOL];
-- 2. 동일 ID 재검사 시 MERGE 문을 이용한 UPSERT 테스트 (정상 업데이트 확인)
-- 예상 결과: 기존 'IC_SIMPLE_0001' 레코드의 LeakValue가 '0.098'로 업데이트됨
MERGE INTO [dbo].[EOL] AS Target
USING (SELECT 'IC_SIMPLE_0001' AS ID) AS Source
ON (Target.ID = Source.ID)
WHEN MATCHED THEN
UPDATE SET
Target.Channel = 'LEFT',
Target.SpecUL = '1.00',
Target.SpecLL = '-1.00',
Target.LeakValue = '0.098', -- 업데이트될 새 값
Target.Result = 'OK',
Target.InspectDate = '2026-06-02',
Target.InspectTime = '14:48:00'
WHEN NOT MATCHED THEN
INSERT ([ID], [Channel], [SpecUL], [SpecLL], [LeakValue], [Result], [InspectDate], [InspectTime])
VALUES ('IC_SIMPLE_0001', 'LEFT', '1.00', '-1.00', '0.098', 'OK', '2026-06-02', '14:48:00');
-- 데이터 확인 (값 업데이트 확인)
SELECT * FROM [dbo].[EOL];
*/

131
README.md

@ -7,42 +7,28 @@ Windows 기반 Air Leak Test 장비를 위한 제어 및 모니터링 GUI 프로
```text ```text
leak_test_project/ leak_test_project/
├── Infrastructure/ # 하드웨어 통신 및 DIO 계층 (Low-Level Communication) ├── Infrastructure/ # 하드웨어 통신 및 DIO 계층 (Low-Level Communication)
│ ├── ICommunication.cs # 통신 방식(Serial, TCP) 추상화 인터페이스 │ ├── CommunicationBase.cs # ICommunication 인터페이스 및 SerialProvider 구현체
│ ├── SerialProvider.cs # RS232 시리얼 통신 구현체 (8N1, IDisposable) │ ├── DioBoardBase.cs # IDioBoard 인터페이스 및 RealDioBoard 구현체
│ ├── IDioBoard.cs # DIO 보드 추상화 인터페이스 (입출력 제어, 이벤트)
│ ├── RealDioBoard.cs # ADLINK PCI DIO 보드 실제 구현체 (10ms 폴링)
│ └── Dask.cs # ADLINK PCIS-DASK API P/Invoke 래퍼 │ └── Dask.cs # ADLINK PCIS-DASK API P/Invoke 래퍼
├── Models/ # 데이터 모델 ├── Models/ # 데이터 모델
│ ├── AppConfig.cs # 앱 설정 (Left/Right/SensorPort, Zmdi/SensorBaudRate, SpecUL/LL) │ └── ProjectModels.cs # AppConfig, DioPoint, InOutItem, InspectData, ParsedData, SensorIdData 일괄 정의
│ ├── DioPoint.cs # DIO 포인트 모델 (Name, IsInput, Value) + DioEventArgs
│ ├── InOutItem.cs # I/O 항목 모델 (Address, Name, Description, Value)
│ ├── InspectData.cs # 검사 결과 데이터 모델 (12개 필드)
│ ├── ParsedData.cs # Sentinel C28 파싱 결과 모델 (MeasuredValue, SensorJudgment 등)
│ └── SensorIdData.cs # 센서 ID 데이터 모델 (LowID, Year/Month/Day, Serial 등)
├── Services/ # 비즈니스 로직 및 기기 제어 ├── Services/ # 비즈니스 로직 및 기기 제어
│ ├── Board4253Service.cs # [신규] 4253 보드 통신 서비스 (<end> 기반 프로토콜) │ ├── Board4251.cs # [신규] 4251 보드 통신 및 서비스 통합 구현체 (서비스/DIO)
│ ├── Board4253SensorService.cs # [신규] 4253 보드 ID 센서 서비스 (IIdSensorService 구현) │ ├── IIdSensorService.cs # [신규] ID 센서 추상화 인터페이스 (4251)
│ ├── Board4253DioBoard.cs # [신규] 4253 보드 DIO 구현체 (IDioBoard 구현)
│ ├── IIdSensorService.cs # [신규] ID 센서 추상화 인터페이스 (ZMDI/4253 공통)
│ ├── DioBoardFactory.cs # DIO 보드 팩토리 (DioConfig.ini 기반 보드 생성) │ ├── DioBoardFactory.cs # DIO 보드 팩토리 (DioConfig.ini 기반 보드 생성)
│ ├── IoBoardService.cs # I/O 보드 서비스 (IDioBoard 연동, 상태 갱신/출력 제어) │ ├── IoBoardService.cs # I/O 보드 서비스 (IDioBoard 연동, 상태 갱신/출력 제어)
│ ├── SentinelC28Service.cs # Sentinel C28 프로토콜 (자동 재연결 포함) │ ├── SentinelC28Service.cs # Sentinel C28 프로토콜 (자동 재연결 포함)
│ ├── TestProcessService.cs # 자동 시험 프로세스 (DIO→센서→시험→판정→출력 사이클) │ └── TestProcessService.cs # 자동 시험 프로세스 (DIO→센서→시험→판정→출력 사이클)
│ └── ZmdiSensorService.cs # ZMDI 센서 시리얼 통신 (ID 읽기/파싱, 4단계 명령)
├── Utils/ # 유틸리티 ├── Utils/ # 유틸리티
│ ├── ConfigManager.cs # XML 기반 설정 관리 (Load/Save, ConfigChanged 이벤트) │ ├── ConfigHelper.cs # XML 설정 관리 (ConfigManager) 및 INI 설정 파서 (DioConfigParser)
│ ├── CsvExporter.cs # 범용 CSV 내보내기 │ ├── LogUtils.cs # FileLogger (일일 로그), LogParser, CsvExporter 통합 유틸리티
│ ├── DioConfigParser.cs # INI 형식 DIO 설정 파서 (보드 타입, 포인트 매핑) │ └── SentinelParser.cs # C28 데이터 파싱 및 SentinelCrc8 (CRC-8 체크섬) 구현
│ ├── FileLogger.cs # 일일 CSV 로그 자동 저장 + 시스템 로그
│ ├── LogParser.cs # CSV 로그 파싱 및 검색 필터링
│ ├── SentinelCrc8.cs # CRC-8 체크섬 계산
│ └── SentinelParser.cs # C28 데이터 파싱 (스트리밍/최종결과/판정)
├── ViewModels/ # MVVM ViewModel ├── ViewModels/ # MVVM ViewModel
│ ├── Core/ │ ├── Core/
│ │ ├── ObservableObject.cs # INotifyPropertyChanged 베이스 클래스 │ │ ├── ObservableObject.cs # INotifyPropertyChanged 베이스 클래스
│ │ └── RelayCommand.cs # ICommand 구현 │ │ └── RelayCommand.cs # ICommand 구현
│ ├── DataViewModel.cs # 데이터 조회/CSV 내보내기/더미 데이터 로드 │ ├── DataViewModel.cs # 데이터 조회/CSV 내보내기/더미 데이터 로드
│ ├── HomeViewModel.cs # 2채널 자동 시험, ZMDI/C28 통신, SPEC 교차 검증 │ ├── HomeViewModel.cs # 2채널 자동 시험, 4251/C28 통신, SPEC 교차 검증
│ ├── InOutViewModel.cs # I/O 모니터 페이징 로직 │ ├── InOutViewModel.cs # I/O 모니터 페이징 로직
│ ├── MainViewModel.cs # 화면 전환, DIO 보드 생성, 앱 생명주기 관리 │ ├── MainViewModel.cs # 화면 전환, DIO 보드 생성, 앱 생명주기 관리
│ └── ParametersViewModel.cs # 파라미터 설정 (빈 클래스, 로직은 Window에서 직접 처리) │ └── ParametersViewModel.cs # 파라미터 설정 (빈 클래스, 로직은 Window에서 직접 처리)
@ -53,17 +39,21 @@ leak_test_project/
│ ├── InOutView.xaml(.cs) # I/O 모니터 (INPUT/OUTPUT 구분) │ ├── InOutView.xaml(.cs) # I/O 모니터 (INPUT/OUTPUT 구분)
│ └── ParametersWindow.xaml(.cs) # SPEC UL/LL 설정 │ └── ParametersWindow.xaml(.cs) # SPEC UL/LL 설정
├── Manual/ # 사용자 매뉴얼 ├── Manual/ # 사용자 매뉴얼
│ ├── Communication_Manual.md # 통신 설정 매뉴얼 │ ├── 01_시스템_개요.md
│ ├── DataView_Manual.md # 데이터 조회 매뉴얼 │ ├── 02_초기_설정.md
│ ├── HomeView_Manual.md # 메인 화면 매뉴얼 │ ├── 03_메인_화면.md
│ ├── IO_Monitor_Manual.md # I/O 모니터 매뉴얼 │ ├── 04_통신_설정.md
│ └── Parameter_Manual.md # 파라미터 설정 매뉴얼 │ ├── 05_시험_설정.md
│ ├── 06_IO_모니터.md
│ ├── 07_데이터_조회.md
│ ├── 08_시험_프로세스.md
│ ├── 09_로그_관리.md
│ ├── 10_오류_대응.md
│ └── 사용자_메뉴얼.md
├── PCI-Dask.dll # ADLINK PCIS-DASK 네이티브 DLL ├── PCI-Dask.dll # ADLINK PCIS-DASK 네이티브 DLL
├── App.xaml # DataTemplate 매핑 + 공통 스타일 ├── App.xaml # DataTemplate 매핑 + 공통 스타일
├── MainWindow.xaml # 메인 Shell (상단바 + 하단 메뉴) ├── MainWindow.xaml # 메인 Shell (상단바 + 하단 메뉴)
└── MainWindow.xaml.cs # 시계, 창 관리, 종료 확인 └── MainWindow.xaml.cs # 시계, 창 관리, 종료 확인
leak_test_project.Tests/ # 단위 테스트 프로젝트 (xUnit/NUnit)
``` ```
## ✨ 주요 기능 ## ✨ 주요 기능
@ -80,9 +70,9 @@ leak_test_project.Tests/ # 단위 테스트 프로젝트 (xUnit/NUnit)
DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서 아래 사이클을 반복합니다: DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서 아래 사이클을 반복합니다:
1. **DIO 시작 신호 대기**: LEFT_START / RIGHT_START 입력 신호 OFF→ON 감지 1. **DIO 시작 신호 대기**: LEFT_START / RIGHT_START 입력 신호 OFF→ON 감지
2. **센서 ID 읽기**: IIdSensorService를 통해 제품 ID 파싱 (ZMDI 또는 4253 보드) 2. **센서 ID 읽기**: IIdSensorService를 통해 제품 ID 파싱 (4251 보드)
3. **불량 제품 필터링**: 센서의 이전 검사 결과(PrevResult) 확인 3. **불량 제품 필터링**: 센서의 이전 검사 결과(PrevResult) 확인
4. **LEAK 시험 수행**: Sentinel C28 최종 결과 수신 대기 (60초 타임아웃) 4. **LEAK 시험 수행**: Sentinel C28 최종 결과 수신 대기 (30초 타임아웃)
5. **판정**: 프로그램 SPEC(UL/LL) 기반 OK/NG 판정 5. **판정**: 프로그램 SPEC(UL/LL) 기반 OK/NG 판정
6. **SPEC 교차 검증**: 프로그램 판정과 센서 자체 판정(A/R) 비교, 불일치 시 경고 6. **SPEC 교차 검증**: 프로그램 판정과 센서 자체 판정(A/R) 비교, 불일치 시 경고
7. **로그 기록**: 일일 CSV 파일에 검사 결과 자동 저장 7. **로그 기록**: 일일 CSV 파일에 검사 결과 자동 저장
@ -104,7 +94,7 @@ DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서
- 불일치 시 `SpecMismatch` 플래그를 활성화하고 콘솔/로그에 경고 출력 - 불일치 시 `SpecMismatch` 플래그를 활성화하고 콘솔/로그에 경고 출력
**타임아웃 처리** **타임아웃 처리**
- 60초 내 C28 결과 미수신 시 자동으로 NG 판정 처리 - 30초 내 C28 결과 미수신 시 자동으로 NG 판정 처리
- 타임아웃 시에도 UI 그리드와 CSV 로그에 NG(센서판정: T/O) 기록 남김 - 타임아웃 시에도 UI 그리드와 CSV 로그에 NG(센서판정: T/O) 기록 남김
- DIO NG 출력 신호도 정상적으로 전송 - DIO NG 출력 신호도 정상적으로 전송
@ -137,13 +127,13 @@ DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서
### 7. 설정 관리 ### 7. 설정 관리
- **파라미터 설정**: SPEC UL/LL (sccm) 값 설정 및 저장 - **파라미터 설정**: SPEC UL/LL (sccm) 값 설정 및 저장
- **통신 설정**: 좌/우 센서 장비 포트(기본 COM9/COM8, 보드레이트 공유 19200)와 C28 센서 포트(기본 COM1, 보드레이트 9600)를 각각 독립 설정 - **통신 설정**: 4251 보드 포트(기본 COM3, 보드레이트 115200) 및 C28 센서 포트(기본 COM1, 보드레이트 9600)를 각각 독립 설정 (4251 보드는 좌/우 센서가 하나의 시리얼 포트를 공유하는 듀얼 채널 통합 방식)
- **XML 설정 파일**: `config.xml`에 자동 저장/로드, 설정 변경 시 `ConfigChanged` 이벤트를 통해 모든 통신 서비스(Sentinel C28, 센서)와 자동 시험 프로세스가 재시작되어 즉시 반영 - **XML 설정 파일**: `config.xml`에 자동 저장/로드, 설정 변경 시 `ConfigChanged` 이벤트를 통해 모든 통신 서비스(Sentinel C28, 센서)와 자동 시험 프로세스가 재시작되어 즉시 반영
- **DIO 설정 파일**: `Settings/DioConfig.ini`에서 보드 타입, 입출력 포인트 이름/설명 관리 - **DIO 설정 파일**: `Settings/DioConfig.ini`에서 보드 타입, 입출력 포인트 이름/설명 관리
### 8. 일일 CSV 로그 자동 저장 ### 8. 일일 CSV 로그 자동 저장
- 검사 완료 시 `Logs/yyyy-MM-dd.csv` 파일에 자동 기록 - 검사 완료 시 `Logs/yyyy-MM-dd.csv` 파일에 자동 기록
- CSV 헤더: Date, Time, Channel, ID, Value, Judgment, Mode, LineNo, ProductType, SpecUL, SpecLL, Retest - CSV 헤더: Date, Time, Channel, ID, Value, Judgment, SpecUL, SpecLL, Retest
- CSV 값 이스케이프 처리 (쉼표/따옴표/줄바꿈 안전 처리) - CSV 값 이스케이프 처리 (쉼표/따옴표/줄바꿈 안전 처리)
- 시스템 텍스트 로그는 `yyyy-MM-dd_system.log`로 별도 관리 - 시스템 텍스트 로그는 `yyyy-MM-dd_system.log`로 별도 관리
@ -151,25 +141,23 @@ DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서
- 프로그램 종료 전 확인 대화상자 표시 - 프로그램 종료 전 확인 대화상자 표시
- 시리얼 포트, DIO 보드, 타이머 등 리소스 종료 시 안전 해제 (IDisposable 패턴) - 시리얼 포트, DIO 보드, 타이머 등 리소스 종료 시 안전 해제 (IDisposable 패턴)
- 모든 통신/파일 I/O 구간에 예외 처리 적용 - 모든 통신/파일 I/O 구간에 예외 처리 적용
- ZMDI 통신 명령 실패 시 최대 3회 재시도
- **포트 연결 알림**: 프로그램 초기화 또는 설정 변경 시 모든 포트(C28, 센서 Left/Right)의 연결 상태를 즉시 확인하고, 하나라도 실패 시 메인 화면 오류 영역에 즉시 표시 (상세 오류 원인 및 포트 번호 포함) - **포트 연결 알림**: 프로그램 초기화 또는 설정 변경 시 모든 포트(C28, 센서 Left/Right)의 연결 상태를 즉시 확인하고, 하나라도 실패 시 메인 화면 오류 영역에 즉시 표시 (상세 오류 원인 및 포트 번호 포함)
- **1초 자동 복구**: 모든 통신 포트에 대해 1초 주기로 상시 자동 재연결 시도 (재진입 방지 포함) - **1초 자동 복구**: 모든 통신 포트에 대해 1초 주기로 상시 자동 재연결 시도 (재진입 방지 포함)
- **통신 설정 변경 반영**: 설정 저장 시 즉시 통신 포트와 자동 시험 프로세스를 재시작하여 프로그램 재시작 없이 설정 변경 내용 적용 가능 - **통신 설정 변경 반영**: 설정 저장 시 즉시 통신 포트와 자동 시험 프로세스를 재시작하여 프로그램 재시작 없이 설정 변경 내용 적용 가능
--- ---
## 🔌 신규 4253 보드 통합 ## 🔌 신규 4251 보드 통합
기존 ZMDI 센서 방식에 추가하여, 신규 4253 보드를 통한 제품 ID 읽기 기능이 구현되었습니다. 신규 4251 보드를 통한 제품 ID 읽기 기능이 구현되었습니다.
### 아키텍처 ### 아키텍처
`IIdSensorService` 인터페이스를 도입하여 기존 `ZmdiSensorService`와 신규 `Board4253SensorService`를 동일한 추상화로 교체 가능하도록 설계되었습니다. `IIdSensorService` 인터페이스를 도입하여 `Board4251SensorService`가 구현체로 탑재되었습니다.
```text ```text
IIdSensorService (인터페이스) IIdSensorService (인터페이스)
├── ZmdiSensorService # 기존 ZMDI 센서 (4단계 시리얼 명령) └── Board4251SensorService # 신규 4251 보드 (2단계 명령: 상태확인 + ID읽기)
└── Board4253SensorService # 신규 4253 보드 (2단계 명령: 상태확인 + ID읽기)
``` ```
### 관련 파일 ### 관련 파일
@ -177,11 +165,9 @@ IIdSensorService (인터페이스)
| 파일 | 역할 | | 파일 | 역할 |
| :--- | :--- | | :--- | :--- |
| `Services/IIdSensorService.cs` | ID 센서 공통 인터페이스 (Connect, Disconnect, ReadSensor) | | `Services/IIdSensorService.cs` | ID 센서 공통 인터페이스 (Connect, Disconnect, ReadSensor) |
| `Services/Board4253Service.cs` | 4253 보드 시리얼 통신 코어 (명령 송수신, `<end>` 기반 프로토콜, 자동 재연결) | | `Services/Board4251.cs` | 4251 보드 통합 구현 (통신 코어, ID 센서 서비스, DIO 구현체 포함) |
| `Services/Board4253SensorService.cs` | 4253 보드 ID 센서 서비스 (상태 확인 → ID 읽기 → SensorIdData 구성) |
| `Services/Board4253DioBoard.cs` | 4253 보드 DIO 구현체 (IDioBoard 인터페이스 구현) |
### 4253 보드 통신 프로토콜 ### 4251 보드 통신 프로토콜
- **포트 공유**: 좌/우 센서가 하나의 시리얼 포트를 공유하며, 채널 번호(`001`=좌, `002`=우)로 구분 - **포트 공유**: 좌/우 센서가 하나의 시리얼 포트를 공유하며, 채널 번호(`001`=좌, `002`=우)로 구분
- **응답 종료 조건**: `<end>`, `Success`, `Fail` 키워드 또는 16자리 영숫자 ID 감지 시 수신 완료 처리 - **응답 종료 조건**: `<end>`, `Success`, `Fail` 키워드 또는 16자리 영숫자 ID 감지 시 수신 완료 처리
@ -189,7 +175,7 @@ IIdSensorService (인터페이스)
- **자동 재연결**: 1초 주기로 연결 상태 감시 및 자동 복구 - **자동 재연결**: 1초 주기로 연결 상태 감시 및 자동 복구
- **송수신 재시도**: 타임아웃 발생 시 최대 3회 리트라이 (300ms 간격) - **송수신 재시도**: 타임아웃 발생 시 최대 3회 리트라이 (300ms 간격)
### 4253 보드 ID 읽기 절차 ### 4251 보드 ID 읽기 절차
| 단계 | 동작 | 명령어 예시 | | 단계 | 동작 | 명령어 예시 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
@ -201,18 +187,18 @@ IIdSensorService (인터페이스)
### ID 끝자리 'F' 재시도 로직 ### ID 끝자리 'F' 재시도 로직
4253 보드에서 읽은 ID의 끝자리가 `F`인 경우, 통신 오류로 인한 잘못된 값일 가능성이 있어 자동으로 재시도합니다. 4251 보드에서 읽은 ID의 끝자리가 `F`인 경우, 통신 오류로 인한 잘못된 값일 가능성이 있어 자동으로 재시도합니다.
```text ```text
[시작] ID 읽기 요청 [시작] ID 읽기 요청
[1차 시도] ReadIdAsync(channel) [1차 시도] ReadIdAsync(channel)
끝자리 == 'F'? ──YES──→ 500ms 대기 후 재시도 끝자리 == 'F'? ──YES──→ 350ms 대기 후 재시도
│ ↓ │ ↓
NO [2차 시도] ReadIdAsync(channel) NO [2차 시도] ReadIdAsync(channel)
↓ ↓ ↓ ↓
[사용] 끝자리 == 'F'? ──YES──→ 500ms 대기 후 재시도 [사용] 끝자리 == 'F'? ──YES──→ 350ms 대기 후 재시도
│ ↓ │ ↓
NO [3차 시도(최종)] ReadIdAsync(channel) NO [3차 시도(최종)] ReadIdAsync(channel)
↓ ↓ ↓ ↓
@ -221,7 +207,7 @@ IIdSensorService (인터페이스)
``` ```
- **최대 재시도 횟수**: 3회 (최초 1회 + 추가 2회) - **최대 재시도 횟수**: 3회 (최초 1회 + 추가 2회)
- **재시도 간격**: 500ms - **재시도 간격**: 350ms
- **진행 상태 표시**: 재시도 시 `ProgressMessage` 이벤트로 UI에 알림 - **진행 상태 표시**: 재시도 시 `ProgressMessage` 이벤트로 UI에 알림
- **3회 모두 'F'로 끝나는 경우**: 마지막 값을 그대로 사용하고 경고 메시지 출력 - **3회 모두 'F'로 끝나는 경우**: 마지막 값을 그대로 사용하고 경고 메시지 출력
@ -231,20 +217,6 @@ IIdSensorService (인터페이스)
프로그램에서 사용하는 주요 하드웨어 통신 명령어 및 절차입니다. 프로그램에서 사용하는 주요 하드웨어 통신 명령어 및 절차입니다.
### 1. ZMDI 센서 (ID 읽기 및 파싱)
ZMDI 센서와의 통신은 `19200 Baud, 8N1` 시리얼 통신을 사용하며, 총 4단계의 명령어 시퀀스로 구성됩니다. 모든 명령어는 `\r\n`을 포함하여 전송되며, 최대 3회 재시도합니다.
| 단계 | 역할 | 주요 명령어 리스트 |
| :--- | :--- | :--- |
| **1단계** | 초기화 및 통신 확인 | `V`, `Pr_D7`, `Pr_D6`, `Pr_D5`, `r` |
| **2단계** | 메모리 접근 준비 | `tso31150` |
| **3단계** | 데이터 수집 설정 | `os_10`, `t11005`, `OWT7800272D1`, `OR_78002`, `OW_780038AA55A`, `OW_780011A`, `OR_78002`, `OW_780038AFF00`, `OW_78001CF`, `OR_78004` |
| **4단계** | ID 메모리 읽기 | `OW_7800140`, `OR_78002`, `OW_7800141`, `OR_78002`, `OW_7800142`, `OR_78002`, `x9c_990:x` |
- **읽기 종료**: 모든 데이터를 읽은 후 `x9c_990:x` 명령으로 세션을 종료합니다.
- **데이터 파싱**: `OR_78002`의 응답값들을 조합하여 12자리 이상의 `LowID`를 생성하고, 이를 디코딩 테이블에 따라 년/월/일/시리얼/라인/아이템 정보를 추출합니다.
- **불량 필터링**: 파싱된 `PrevResult` 필드로 이전 검사 결과를 확인하여 불량 제품을 필터링합니다.
--- ---
### 2. Sentinel C28 (Leak Test 장비) ### 2. Sentinel C28 (Leak Test 장비)
@ -261,7 +233,7 @@ Sentinel C28과의 통신은 `9600 Baud, 8N1` 시리얼 통신을 사용하며,
- `R (Result)`: 최종 검사 완료 후 수신되는 결과 데이터 (채널#, 시리얼, 측정값, 판정 등 포함) - `R (Result)`: 최종 검사 완료 후 수신되는 결과 데이터 (채널#, 시리얼, 측정값, 판정 등 포함)
- `S (Streaming)`: 시험 진행 중 실시간으로 수신되는 압력/유량 데이터 - `S (Streaming)`: 시험 진행 중 실시간으로 수신되는 압력/유량 데이터
- **LEAK 시험 대기 타임아웃**: 기계의 실제 측정 시간이 약 30초이므로, 프로그램은 **60초** 동안 C28 최종 결과를 대기합니다. 60초 내에 결과가 수신되지 않으면 자동으로 NG 처리됩니다. - **LEAK 시험 대기 타임아웃**: 기계의 실제 측정 시간이 약 30초이므로, 프로그램은 **30초** 동안 C28 최종 결과를 대기합니다. 30초 내에 결과가 수신되지 않으면 자동으로 NG 처리됩니다.
- **SPEC 교차 검증**: C28 센서의 자체 판정(A=Accept, R=Reject)과 프로그램의 UL/LL 기반 판정을 비교하여 불일치 시 경고 메시지를 표시합니다. - **SPEC 교차 검증**: C28 센서의 자체 판정(A=Accept, R=Reject)과 프로그램의 UL/LL 기반 판정을 비교하여 불일치 시 경고 메시지를 표시합니다.
@ -294,30 +266,29 @@ ADLINK PCI DIO 보드와의 통신은 PCIS-DASK API(PCI-Dask.dll)를 사용합
### 2026-04-13 ### 2026-04-13
#### LEAK 시험 타임아웃 개선 (`TestProcessService.cs`) #### LEAK 시험 타임아웃 개선 및 예외 처리 반영 (`TestProcessService.cs`)
- **문제**: 기계 측정 시간이 약 30초인데 프로그램 대기 타임아웃도 30초로 동일하게 설정되어 있어, 기계가 불량(NG)을 판정하여 결과 데이터를 전송하려는 시점에 프로그램이 이미 타임아웃으로 넘어가버리는 현상 발생. 또한 타임아웃 발생 시 UI와 로그에 결과가 남지 않는 문제 존재. - **문제**: 기계 측정 타임아웃 발생 시 UI와 로그에 결과가 남지 않는 문제 존재.
- **수정 내용**: - **수정 내용**:
- C28 결과 대기 타임아웃을 **30초 → 60초**로 확장하여, 기계의 측정 시간(약 30초)을 충분히 수용
- 타임아웃 발생 시에도 **UI 그리드에 NG 결과 표시** (`TestCompleted` 이벤트에 `Judgment="NG"`, `SensorJudgment="T/O"` 전달) - 타임아웃 발생 시에도 **UI 그리드에 NG 결과 표시** (`TestCompleted` 이벤트에 `Judgment="NG"`, `SensorJudgment="T/O"` 전달)
- 타임아웃 발생 시에도 **CSV 로그 파일에 NG 기록** (`FileLogger.LogInspectData` 호출) - 타임아웃 발생 시에도 **CSV 로그 파일에 NG 기록** (`FileLogger.LogInspectData` 호출)
- DIO **NG 출력 신호** 정상 전송 유지 - DIO **NG 출력 신호** 정상 전송 유지
#### 4253 보드 ID 끝자리 'F' 재시도 로직 추가 (`Board4253SensorService.cs`) #### 4251 보드 ID 끝자리 'F' 재시도 로직 추가 (`Board4251.cs`)
- **문제**: 4253 보드에서 ID를 읽을 때 간헐적으로 끝자리가 'F'인 잘못된 값이 읽히는 현상 발생 - **문제**: 4251 보드에서 ID를 읽을 때 간헐적으로 끝자리가 'F'인 잘못된 값이 읽히는 현상 발생
- **수정 내용**: - **수정 내용**:
- ID 읽기 후 끝자리가 `F`(대소문자 무관)인 경우 **최대 2번 추가 재시도** (총 3회 시도) - ID 읽기 후 끝자리가 `F`(대소문자 무관)인 경우 **최대 2번 추가 재시도** (총 3회 시도)
- 각 재시도 전 **500ms 대기**하여 보드 안정화 - 각 재시도 전 **350ms 대기**하여 보드 안정화
- 재시도 시 **ProgressMessage 이벤트**로 UI에 진행 상황 알림 - 재시도 시 **ProgressMessage 이벤트**로 UI에 진행 상황 알림
- 3회 모두 실패 시 마지막으로 읽은 ID를 그대로 사용하되 경고 메시지 출력 - 3회 모두 실패 시 마지막으로 읽은 ID를 그대로 사용하되 경고 메시지 출력
### 2026-04-10 ### 2026-04-10
#### 4253 보드 듀얼 채널 통합 (`Board4253Service.cs`, `Board4253SensorService.cs`) #### 4251 보드 듀얼 채널 통합 (`Board4251.cs`)
- 좌/우 센서가 하나의 시리얼 포트를 공유하도록 `AppConfig` 모델 통합 - 좌/우 센서가 하나의 시리얼 포트를 공유하도록 `AppConfig` 모델 통합
- 채널별 명령어 분리 (`001`=좌, `002`=우) - 채널별 명령어 분리 (`001`=좌, `002`=우)
- `CommunicationWindow` UI에서 포트 설정 통합 반영 - `CommunicationWindow` UI에서 포트 설정 통합 반영
#### 4253 보드 상태 확인 게이트키퍼 복원 #### 4251 보드 상태 확인 게이트키퍼 복원
- `CheckStatusAsync()` 호출 후 `Fail` 응답 시 ID 읽기 중단 - `CheckStatusAsync()` 호출 후 `Fail` 응답 시 ID 읽기 중단
- 타임아웃 5000ms로 설정하여 하드웨어 응답 시간 수용 - 타임아웃 5000ms로 설정하여 하드웨어 응답 시간 수용
@ -339,19 +310,9 @@ ADLINK PCI DIO 보드와의 통신은 PCIS-DASK API(PCI-Dask.dll)를 사용합
- **DIO 포인트 변경**: `Settings/DioConfig.ini`에서 입출력 포인트 이름/설명을 수정하면 프로그램 재시작 시 반영 - **DIO 포인트 변경**: `Settings/DioConfig.ini`에서 입출력 포인트 이름/설명을 수정하면 프로그램 재시작 시 반영
- **DIO 보드 타입 추가**: `Infrastructure/RealDioBoard.cs``GetCardTypeFromConfig()` 메서드에 새 보드 타입 매핑 추가 - **DIO 보드 타입 추가**: `Infrastructure/RealDioBoard.cs``GetCardTypeFromConfig()` 메서드에 새 보드 타입 매핑 추가
- **시험 프로세스 수정**: `Services/TestProcessService.cs``ProcessProc()` 메서드에서 시험 단계 추가/변경 - **시험 프로세스 수정**: `Services/TestProcessService.cs``ProcessProc()` 메서드에서 시험 단계 추가/변경
- **ZMDI 명령 시퀀스 수정**: `Services/ZmdiSensorService.cs``_commandList1~4` 배열 수정 - **4251 보드 명령어 수정**: `Services/Board4251.cs``CheckStatusAsync()`, `ReadIdAsync()` 메서드에서 전송 명령어 변경
- **ID 디코딩 테이블 수정**: `Services/ZmdiSensorService.cs``_yearHexList`, `_monthList`, `_dayHexList` 등 업데이트
- **4253 보드 명령어 수정**: `Services/Board4253Service.cs``CheckStatusAsync()`, `ReadIdAsync()` 메서드에서 전송 명령어 변경
- **사용자 매뉴얼**: `Manual/` 폴더에서 각 화면별 사용 설명서 확인 및 수정 가능 - **사용자 매뉴얼**: `Manual/` 폴더에서 각 화면별 사용 설명서 확인 및 수정 가능
## 🧪 테스트
`leak_test_project.Tests` 프로젝트에서 핵심 서비스의 단위 테스트를 실행할 수 있습니다.
```bash
dotnet test leak_test_project.Tests/leak_test_project.Tests.csproj
```
## 🚀 실행 방법 ## 🚀 실행 방법
1. Visual Studio에서 `leak_test_project.slnx` 파일을 엽니다. 1. Visual Studio에서 `leak_test_project.slnx` 파일을 엽니다.
2. `F5` 키를 눌러 실행하거나 빌드 후 `bin/Debug/leak_test_project.exe`를 실행합니다. 2. `F5` 키를 눌러 실행하거나 빌드 후 `bin/Debug/leak_test_project.exe`를 실행합니다.

71
StartupLoginWindow.xaml.cs

@ -0,0 +1,71 @@
using System.Windows;
namespace Housing.Login
{
/*
* Usage in App.xaml.cs or Program.cs:
*
* var loginWindow = new Housing.Login.StartupLoginWindow();
* if (loginWindow.ShowDialog() != true)
* {
* return;
* }
*
* StartupLoginWindowResult loginResult = loginWindow.Result;
*/
public sealed class StartupLoginWindowResult
{
public string Maker { get; set; } = string.Empty;
public string Model { get; set; } = string.Empty;
public string ColorCode { get; set; } = string.Empty;
public string Operator { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string LineNo { get; set; } = string.Empty;
public string LotNo { get; set; } = string.Empty;
public string JigNo { get; set; } = string.Empty;
}
public partial class StartupLoginWindow : Window
{
public StartupLoginWindowResult Result { get; private set; } = new StartupLoginWindowResult();
public StartupLoginWindow()
{
InitializeComponent();
PasswordBox.Password = "test";
}
private void LogInButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(OperatorTextBox.Text))
{
MessageBox.Show(this, "Please enter Operator.", "Login", MessageBoxButton.OK, MessageBoxImage.Warning);
OperatorTextBox.Focus();
return;
}
if (string.IsNullOrWhiteSpace(PasswordBox.Password))
{
MessageBox.Show(this, "Please enter Password.", "Login", MessageBoxButton.OK, MessageBoxImage.Warning);
PasswordBox.Focus();
return;
}
Result = new StartupLoginWindowResult
{
Maker = MakerTextBox.Text.Trim(),
Model = ModelTextBox.Text.Trim(),
ColorCode = ColorCodeTextBox.Text.Trim(),
Operator = OperatorTextBox.Text.Trim(),
Password = PasswordBox.Password,
LineNo = LineNoTextBox.Text.Trim(),
LotNo = LotNoTextBox.Text.Trim(),
JigNo = JigNoTextBox.Text.Trim()
};
DialogResult = true;
Close();
}
}
}

BIN
docs/NE1aW 온압센서 공정 시방서 및 Tooling 개발 계획_Rev.0_26.05.22 -모비다임 송부.pdf

Binary file not shown.

BIN
docs/★NE1aW 온압센서 DB Specification_Rev.01_26.05.25.xlsx

Binary file not shown.

104
leak_test_project.Tests/Services/Board4251ServiceTests.cs

@ -1,104 +0,0 @@
using System;
using System.Threading.Tasks;
using leak_test_project.Infrastructure;
using leak_test_project.Services;
using Moq;
using Xunit;
namespace leak_test_project.Tests.Services
{
public class Board4251ServiceTests
{
[Fact]
public async Task CheckStatusAsync_Success_ReturnsTrue()
{
// Arrange
var mockComm = new Mock<ICommunication>();
mockComm.Setup(c => c.IsOpen).Returns(true);
var service = new Board4251Service(mockComm.Object);
int channel = 1;
string expectedCommand = "x00c_001101:owt28006727ea97c7801\r\n";
// Simulate receiving Success message
mockComm.Setup(c => c.Write(It.Is<string>(s => s == expectedCommand)))
.Callback<string>(cmd => {
Task.Run(() => {
mockComm.Raise(c => c.DataReceived += null, mockComm.Object, "Response: Success <end>");
});
});
// Act
bool result = await service.CheckStatusAsync(channel);
// Assert
Assert.True(result);
mockComm.Verify(c => c.Write(expectedCommand), Times.AtLeastOnce);
}
[Fact]
public async Task CheckStatusAsync_Fail_ReturnsFalse()
{
// Arrange
var mockComm = new Mock<ICommunication>();
mockComm.Setup(c => c.IsOpen).Returns(true);
var service = new Board4251Service(mockComm.Object);
// Simulate receiving Fail message
mockComm.Setup(c => c.Write(It.IsAny<string>()))
.Callback<string>(cmd => {
Task.Run(() => {
mockComm.Raise(c => c.DataReceived += null, mockComm.Object, "Response: Fail <end>");
});
});
// Act
bool result = await service.CheckStatusAsync(); // 기본값 채널 1 테스트
// Assert
Assert.False(result);
}
[Fact]
public async Task ReadIdAsync_ValidId_ReturnsId()
{
// Arrange
var mockComm = new Mock<ICommunication>();
mockComm.Setup(c => c.IsOpen).Returns(true);
var service = new Board4251Service(mockComm.Object);
string expectedId = "ABC1234567890XYZ";
int channel = 2;
string expectedCommand = "x00c_002101:ow2800326003e\r\n";
// Simulate receiving ID
mockComm.Setup(c => c.Write(It.Is<string>(s => s == expectedCommand)))
.Callback<string>(cmd => {
Task.Run(() => {
mockComm.Raise(c => c.DataReceived += null, mockComm.Object, $"ID: {expectedId}\r\n<end>");
});
});
// Act
string resultId = await service.ReadIdAsync(channel);
// Assert
Assert.Equal(expectedId, resultId);
mockComm.Verify(c => c.Write(expectedCommand), Times.AtLeastOnce);
}
[Fact]
public async Task ReadIdAsync_Timeout_ReturnsNull()
{
// Arrange
var mockComm = new Mock<ICommunication>();
mockComm.Setup(c => c.IsOpen).Returns(true);
var service = new Board4251Service(mockComm.Object);
service.TimeoutMs = 100; // 타임아웃 테스트 속도를 위해 100ms로 설정
// Act
string resultId = await service.ReadIdAsync();
// Assert
Assert.Null(resultId);
}
}
}

30
leak_test_project.Tests/Utils/SentinelCrc8Tests.cs

@ -1,30 +0,0 @@
using Xunit;
using leak_test_project.Utils;
namespace leak_test_project.Tests.Utils
{
public class SentinelCrc8Tests
{
[Theory]
[InlineData("ABC", "40")] // 0x41 ^ 0x42 ^ 0x43 = 0x40
[InlineData("123", "30")] // 0x31 ^ 0x32 ^ 0x33 = 0x30
public void CalculateHex_ShouldReturnXorSum(string input, string expected)
{
// Act
var result = SentinelCrc8.CalculateHex(input);
// Assert
Assert.Equal(expected, result);
}
[Fact]
public void CalculateHex_EmptyString_ShouldReturn00()
{
// Act
var result = SentinelCrc8.CalculateHex("");
// Assert
Assert.Equal("00", result);
}
}
}

149
leak_test_project.Tests/Utils/SentinelParserTests.cs

@ -1,149 +0,0 @@
using Xunit;
using leak_test_project.Utils;
using leak_test_project.Models;
namespace leak_test_project.Tests.Utils
{
public class SentinelParserTests
{
[Theory]
[InlineData("AABB010\tH\tLR 0.123456 sccm", 'H', "LR 0.123456 sccm")]
[InlineData("AABB010 H LR 0.123456 sccm", 'H', "LR 0.123456 sccm")]
public void ExtractBody_ValidHeaderInput_ShouldExtractCorrectBodyAndTypeCode(string input, char expectedType, string expectedBody)
{
// Act
string resultBody = SentinelParser.ExtractBody(input, out char resultType);
// Assert
Assert.Equal(expectedType, resultType);
Assert.Equal(expectedBody, resultBody);
}
[Fact]
public void ExtractBody_AutoResult_NoHeader_ShouldReturnResultType()
{
// Arrange (C28 매뉴얼 표 규격: 헤더 없이 탭으로 구분된 최소 8개의 필드)
string input = "C01\tN1\tP01\tR--\t16:15:14.123\t02/01/16\t0000098353\tA\t*\tPLR\tP\tLR 0.123456 sccm\tLR 0.123456 sccm\t\t\r\n";
// Act
string resultBody = SentinelParser.ExtractBody(input, out char resultType);
// Assert
Assert.Equal('R', resultType);
Assert.Equal(input.Trim(), resultBody);
}
[Fact]
public void ExtractBody_AutoStreaming_NoHeader_ShouldReturnStreamingType()
{
// Arrange (헤더 없는 단순 스트리밍 데이터)
string input = "LR 0.123456 sccm\r\n";
// Act
string resultBody = SentinelParser.ExtractBody(input, out char resultType);
// Assert
Assert.Equal('S', resultType);
Assert.Equal(input.Trim(), resultBody);
}
[Fact]
public void ParseStreamingValue_ValidInput_ShouldParseValueAndUnit()
{
// Arrange
string input = "AABB010\tH\tLR 0.123456 sccm";
// Act
ParsedData result = SentinelParser.ParseStreamingValue(input);
// Assert
Assert.Equal(0.123456, result.MeasuredValue);
Assert.Equal("sccm", result.Unit);
}
[Fact]
public void ParseStreamingValue_NoHeader_ShouldParseValueAndUnit()
{
// Arrange
string input = "LR -1.50 sccm\r\n";
// Act
ParsedData result = SentinelParser.ParseStreamingValue(input);
// Assert
Assert.Equal(-1.50, result.MeasuredValue);
Assert.Equal("sccm", result.Unit);
}
[Fact]
public void ParseFinalResult_ValidInput_ShouldParseAllFields()
{
// Arrange
// Sample based on manual: XXYYZZZ \t H \t C## \t P## \t LL \t HH:MM:SS \t MM/DD/YY \t ID \t Eval ...
string body = "C01\tPort1\tP05\tLink\t12:30:45\t03/26/24\t1234567890\tA\tFlag\tTest\tEval\tLR 0.5 sccm";
string input = "XXXXYYY\tH\t" + body;
// Act
ParsedData result = SentinelParser.ParseFinalResult(input);
// Assert
Assert.Equal("C01", result.ChannelNo);
Assert.Equal("P05", result.ProgramNo);
Assert.Equal("OK", result.Judgment); // A -> OK
Assert.Equal(0.5, result.MeasuredValue);
Assert.Equal("sccm", result.Unit);
}
[Fact]
public void ParseFinalResult_AutoResult_NoHeader_ShouldParseAllFields()
{
// Arrange (C28 매뉴얼 Appendix D 표와 정확히 동일한 형식의 Auto Result 데이터)
// Channel | Port | Prog | Link | Time | Date | UniqueId | Eval | SPC | Type | TestEval | TestData1
string input = "C01\tN1\tP01\tR--\t16:15:14.123\t02/01/16\t0000098353\tA\t*\tPLR\tP\tLR 0.123456 sccm\tLR 0.123456 sccm\t\t\r\n";
// Act
ParsedData result = SentinelParser.ParseFinalResult(input);
// Assert
Assert.Equal("C01", result.ChannelNo);
Assert.Equal("P01", result.ProgramNo);
Assert.Equal("16:15:14.123", result.TestTime);
Assert.Equal("02/01/16", result.TestDate);
Assert.Equal("0000098353", result.UniqueId);
Assert.Equal("98353", result.SerialNo); // 마지막 5자리
Assert.Equal("OK", result.Judgment); // A -> OK
Assert.Equal("A", result.SensorJudgment);
Assert.Equal(0.123456, result.MeasuredValue);
Assert.Equal("sccm", result.Unit);
}
[Fact]
public void ParseFinalResult_AutoResult_Reject_ShouldParseProperly()
{
// Arrange (불량 판정 시의 Auto Result 데이터 시뮬레이션)
string input = "C02\tN1\tP02\tR--\t16:15:15.000\t02/01/16\t1111111111\tR\t*\tPLR\tF\tLR 1.50 sccm\t\t\r\n";
// Act
ParsedData result = SentinelParser.ParseFinalResult(input);
// Assert
Assert.Equal("C02", result.ChannelNo);
Assert.Equal("NG", result.Judgment); // R -> NG
Assert.Equal("R", result.SensorJudgment);
Assert.Equal(1.50, result.MeasuredValue);
}
[Theory]
[InlineData(5.0, 10.0, 1.0, "OK")]
[InlineData(15.0, 10.0, 1.0, "NG")]
[InlineData(0.5, 10.0, 1.0, "NG")]
public void EvaluateJudgment_ShouldReturnCorrectStatus(double value, double ul, double ll, string expected)
{
// Act
var result = SentinelParser.EvaluateJudgment(value, ul, ll);
// Assert
Assert.Equal(expected, result);
}
}
}

BIN
leak_test_project.Tests/bin/Debug/net472/Castle.Core.dll

Binary file not shown.

2
leak_test_project.Tests/bin/Debug/net472/Logs/2026-04-08_system.log

@ -1,2 +0,0 @@
[09:44:25.780] [ERROR] [Board4253] Timeout waiting for response: x00c_001101:or2800326003e
[09:46:59.088] [ERROR] [Board4253] Timeout waiting for response: x00c_001101:or2800326003e

25
leak_test_project.Tests/bin/Debug/net472/Logs/2026-04-24_system.log

@ -1,25 +0,0 @@
[10:14:54.667] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:14:55.084] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:14:55.501] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:14:55.934] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:14:55.934] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e
[10:18:58.651] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:18:59.085] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:18:59.502] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:18:59.920] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:18:59.920] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e
[10:19:07.251] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:19:07.669] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:19:08.101] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:19:08.535] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:19:08.536] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e
[10:25:39.456] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:39.881] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:40.304] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:40.725] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:40.726] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e
[10:26:30.241] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:26:30.672] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:26:31.088] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:26:31.505] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:26:31.505] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e

BIN
leak_test_project.Tests/bin/Debug/net472/Microsoft.TestPlatform.CoreUtilities.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/Microsoft.TestPlatform.PlatformAbstractions.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/Microsoft.VisualStudio.CodeCoverage.Shim.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/Moq.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/NuGet.Frameworks.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/System.Collections.Immutable.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/System.Reflection.Metadata.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/System.Runtime.CompilerServices.Unsafe.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/System.Threading.Tasks.Extensions.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/de/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/es/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/it/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/leak_test_project.Tests.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/leak_test_project.Tests.pdb

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.abstractions.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.assert.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.core.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.execution.desktop.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.runner.reporters.net452.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.runner.utility.net452.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/xunit.runner.visualstudio.testadapter.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll

Binary file not shown.

BIN
leak_test_project.Tests/bin/Debug/net472/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll

Binary file not shown.

10
leak_test_project.Tests/bin/Release/net472/Logs/2026-04-24_system.log

@ -1,10 +0,0 @@
[10:24:40.119] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:24:40.539] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:24:40.970] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:24:41.396] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:24:41.396] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e
[10:25:21.146] [WARNING] [Board4251] Timeout waiting for response (Retry 1/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:21.569] [WARNING] [Board4251] Timeout waiting for response (Retry 2/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:21.995] [WARNING] [Board4251] Timeout waiting for response (Retry 3/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:22.417] [WARNING] [Board4251] Timeout waiting for response (Retry 4/3). Command: x00c_001101:ow2800326003e, ReceivedSoFar:
[10:25:22.417] [ERROR] [Board4251] Failed to receive response after 3 retries: x00c_001101:ow2800326003e

47
leak_test_project.Tests/leak_test_project.Tests.csproj

@ -1,47 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<IsPackable>false</IsPackable>
<RootNamespace>leak_test_project.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.6.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.4">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Moq" Version="4.20.70" />
</ItemGroup>
<ItemGroup>
<Reference Include="PresentationFramework" />
<Reference Include="PresentationCore" />
<Reference Include="WindowsBase" />
<Reference Include="System.Xaml" />
</ItemGroup>
<ItemGroup>
<!--<ProjectReference Include="..\leak_test_project\leak_test_project.csproj" />-->
<Compile Include="..\leak_test_project\Utils\ConfigHelper.cs" Link="Utils\ConfigHelper.cs" />
<Compile Include="..\leak_test_project\Utils\SentinelParser.cs" Link="Utils\SentinelParser.cs" />
<Compile Include="..\leak_test_project\Utils\LogUtils.cs" Link="Utils\LogUtils.cs" />
<Compile Include="..\leak_test_project\Models\ProjectModels.cs" Link="Models\ProjectModels.cs" />
<Compile Include="..\leak_test_project\Infrastructure\CommunicationBase.cs" Link="Infrastructure\CommunicationBase.cs" />
<Compile Include="..\leak_test_project\Infrastructure\DioBoardBase.cs" Link="Infrastructure\DioBoardBase.cs" />
<Compile Include="..\leak_test_project\Infrastructure\Dask.cs" Link="Infrastructure\Dask.cs" />
<Compile Include="..\leak_test_project\Services\IIdSensorService.cs" Link="Services\IIdSensorService.cs" />
<Compile Include="..\leak_test_project\Services\SentinelC28Service.cs" Link="Services\SentinelC28Service.cs" />
<Compile Include="..\leak_test_project\Services\IoBoardService.cs" Link="Services\IoBoardService.cs" />
<Compile Include="..\leak_test_project\Services\DioBoardFactory.cs" Link="Services\DioBoardFactory.cs" />
<Compile Include="..\leak_test_project\Services\TestProcessService.cs" Link="Services\TestProcessService.cs" />
<Compile Include="..\leak_test_project\Services\Board4251.cs" Link="Services\Board4251.cs" />
</ItemGroup>
</Project>

4
leak_test_project.Tests/obj/Debug/net472/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]

0
leak_test_project.Tests/obj/Debug/net472/leak_tes.E02BB52F.Up2Date

23
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.AssemblyInfo.cs

@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("leak_test_project.Tests")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+77d1c3aaba381d0c78380cabfaed51897a31edc1")]
[assembly: System.Reflection.AssemblyProductAttribute("leak_test_project.Tests")]
[assembly: System.Reflection.AssemblyTitleAttribute("leak_test_project.Tests")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

1
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.AssemblyInfoInputs.cache

@ -1 +0,0 @@
dfa1bcc3dd55c3f75b42b34a72f780d712c9e1147faf3e82c45e2f51cf41885f

8
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.GeneratedMSBuildEditorConfig.editorconfig

@ -1,8 +0,0 @@
is_global = true
build_property.RootNamespace = leak_test_project.Tests
build_property.ProjectDir = C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false
build_property.EffectiveAnalysisLevelStyle =
build_property.EnableCodeStyleSeverity =

BIN
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.assets.cache

Binary file not shown.

BIN
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.AssemblyReference.cache

Binary file not shown.

0
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.BuildWithSkipAnalyzers

1
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.CoreCompileInputs.cache

@ -1 +0,0 @@
0c498c72e1af24f34d80cd6f85d77cb00370ba1742f248052ac2cf5deed9afa2

54
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.csproj.FileListAbsolute.txt

@ -1,54 +0,0 @@
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.runner.visualstudio.testadapter.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.abstractions.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.runner.reporters.net452.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.runner.utility.net452.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\leak_test_project.Tests.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\leak_test_project.Tests.pdb
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\Castle.Core.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\Microsoft.VisualStudio.CodeCoverage.Shim.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\Microsoft.TestPlatform.CoreUtilities.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\Microsoft.TestPlatform.PlatformAbstractions.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\Moq.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\NuGet.Frameworks.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\System.Collections.Immutable.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\System.Reflection.Metadata.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\System.Runtime.CompilerServices.Unsafe.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\System.Threading.Tasks.Extensions.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.assert.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.core.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\xunit.execution.desktop.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\cs\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\cs\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\de\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\de\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\es\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\es\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\fr\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\fr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\it\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\it\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\ja\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\ja\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\ko\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\ko\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\pl\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\pl\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\pt-BR\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\ru\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\ru\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\tr\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\tr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\zh-Hans\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\zh-Hant\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Debug\net472\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.csproj.AssemblyReference.cache
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.AssemblyInfoInputs.cache
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.AssemblyInfo.cs
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.csproj.CoreCompileInputs.cache
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_tes.E02BB52F.Up2Date
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Debug\net472\leak_test_project.Tests.pdb

BIN
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.dll

Binary file not shown.

BIN
leak_test_project.Tests/obj/Debug/net472/leak_test_project.Tests.pdb

Binary file not shown.

4
leak_test_project.Tests/obj/Release/net472/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]

23
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.AssemblyInfo.cs

@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("leak_test_project.Tests")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+77d1c3aaba381d0c78380cabfaed51897a31edc1")]
[assembly: System.Reflection.AssemblyProductAttribute("leak_test_project.Tests")]
[assembly: System.Reflection.AssemblyTitleAttribute("leak_test_project.Tests")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

1
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.AssemblyInfoInputs.cache

@ -1 +0,0 @@
acbfea79027e4ab25c0f7b2b015d0f8ac8002d7760da81e077d21947bf758347

8
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.GeneratedMSBuildEditorConfig.editorconfig

@ -1,8 +0,0 @@
is_global = true
build_property.RootNamespace = leak_test_project.Tests
build_property.ProjectDir = C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false
build_property.EffectiveAnalysisLevelStyle =
build_property.EnableCodeStyleSeverity =

BIN
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.assets.cache

Binary file not shown.

BIN
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.AssemblyReference.cache

Binary file not shown.

0
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.BuildWithSkipAnalyzers

1
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.CoreCompileInputs.cache

@ -1 +0,0 @@
00716152d706ef3c486fd25e9c4535b79d009a6ebc9ecbc7d98bc05e0e6dd29a

54
leak_test_project.Tests/obj/Release/net472/leak_test_project.Tests.csproj.FileListAbsolute.txt

@ -1,54 +0,0 @@
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.runner.visualstudio.testadapter.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.abstractions.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.runner.reporters.net452.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.runner.utility.net452.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\leak_test_project.Tests.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\leak_test_project.Tests.pdb
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\Castle.Core.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\Microsoft.VisualStudio.CodeCoverage.Shim.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\Microsoft.TestPlatform.CoreUtilities.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\Microsoft.TestPlatform.PlatformAbstractions.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\Moq.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\NuGet.Frameworks.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\System.Collections.Immutable.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\System.Reflection.Metadata.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\System.Runtime.CompilerServices.Unsafe.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\System.Threading.Tasks.Extensions.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.assert.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.core.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\xunit.execution.desktop.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\cs\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\cs\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\de\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\de\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\es\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\es\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\fr\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\fr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\it\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\it\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\ja\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\ja\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\ko\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\ko\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\pl\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\pl\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\pt-BR\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\ru\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\ru\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\tr\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\tr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\zh-Hans\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\zh-Hant\Microsoft.TestPlatform.CoreUtilities.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\bin\Release\net472\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.csproj.AssemblyReference.cache
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.AssemblyInfoInputs.cache
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.AssemblyInfo.cs
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.csproj.CoreCompileInputs.cache
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_tes.E02BB52F.Up2Date
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.dll
C:\Users\COMPUTER1\Desktop\mobi\leak_test_project\leak_test_project.Tests\obj\Release\net472\leak_test_project.Tests.pdb

86
leak_test_project.Tests/obj/leak_test_project.Tests.csproj.nuget.dgspec.json

@ -1,86 +0,0 @@
{
"format": 1,
"restore": {
"C:\\Users\\COMPUTER1\\Desktop\\mobi\\leak_test_project\\leak_test_project.Tests\\leak_test_project.Tests.csproj": {}
},
"projects": {
"C:\\Users\\COMPUTER1\\Desktop\\mobi\\leak_test_project\\leak_test_project.Tests\\leak_test_project.Tests.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\leak_test_project\\leak_test_project.Tests\\leak_test_project.Tests.csproj",
"projectName": "leak_test_project.Tests",
"projectPath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\leak_test_project\\leak_test_project.Tests\\leak_test_project.Tests.csproj",
"packagesPath": "C:\\Users\\COMPUTER1\\.nuget\\packages\\",
"outputPath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\leak_test_project\\leak_test_project.Tests\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\COMPUTER1\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net472"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net472": {
"framework": "net472",
"targetAlias": "net472",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.300"
},
"frameworks": {
"net472": {
"framework": "net472",
"targetAlias": "net472",
"dependencies": {
"Microsoft.NET.Test.Sdk": {
"target": "Package",
"version": "[17.8.0, )"
},
"Moq": {
"target": "Package",
"version": "[4.20.70, )"
},
"coverlet.collector": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
"suppressParent": "All",
"target": "Package",
"version": "[6.0.0, )"
},
"xunit": {
"target": "Package",
"version": "[2.6.2, )"
},
"xunit.runner.visualstudio": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
"suppressParent": "All",
"target": "Package",
"version": "[2.5.4, )"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.300-preview.0.26177.108\\RuntimeIdentifierGraph.json"
}
}
}
}
}

25
leak_test_project.Tests/obj/leak_test_project.Tests.csproj.nuget.g.props

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\COMPUTER1\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\COMPUTER1\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)xunit.runner.visualstudio\2.5.4\build\net462\xunit.runner.visualstudio.props" Condition="Exists('$(NuGetPackageRoot)xunit.runner.visualstudio\2.5.4\build\net462\xunit.runner.visualstudio.props')" />
<Import Project="$(NuGetPackageRoot)xunit.core\2.6.2\build\xunit.core.props" Condition="Exists('$(NuGetPackageRoot)xunit.core\2.6.2\build\xunit.core.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.props" Condition="Exists('$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\net462\Microsoft.NET.Test.Sdk.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\net462\Microsoft.NET.Test.Sdk.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Pkgxunit_analyzers Condition=" '$(Pkgxunit_analyzers)' == '' ">C:\Users\COMPUTER1\.nuget\packages\xunit.analyzers\1.6.0</Pkgxunit_analyzers>
</PropertyGroup>
</Project>

9
leak_test_project.Tests/obj/leak_test_project.Tests.csproj.nuget.g.targets

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)xunit.core\2.6.2\build\xunit.core.targets" Condition="Exists('$(NuGetPackageRoot)xunit.core\2.6.2\build\xunit.core.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.codecoverage\17.8.0\build\netstandard2.0\Microsoft.CodeCoverage.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\net462\Microsoft.NET.Test.Sdk.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.net.test.sdk\17.8.0\build\net462\Microsoft.NET.Test.Sdk.targets')" />
<Import Project="$(NuGetPackageRoot)coverlet.collector\6.0.0\build\netstandard1.0\coverlet.collector.targets" Condition="Exists('$(NuGetPackageRoot)coverlet.collector\6.0.0\build\netstandard1.0\coverlet.collector.targets')" />
</ImportGroup>
</Project>

1007
leak_test_project.Tests/obj/project.assets.json

File diff suppressed because it is too large

28
leak_test_project.Tests/obj/project.nuget.cache

@ -1,28 +0,0 @@
{
"version": 2,
"dgSpecHash": "mKqjtWarivM=",
"success": true,
"projectFilePath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\leak_test_project\\leak_test_project.Tests\\leak_test_project.Tests.csproj",
"expectedPackageFiles": [
"C:\\Users\\COMPUTER1\\.nuget\\packages\\castle.core\\5.1.1\\castle.core.5.1.1.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\coverlet.collector\\6.0.0\\coverlet.collector.6.0.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\microsoft.codecoverage\\17.8.0\\microsoft.codecoverage.17.8.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\microsoft.net.test.sdk\\17.8.0\\microsoft.net.test.sdk.17.8.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.8.0\\microsoft.testplatform.objectmodel.17.8.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\moq\\4.20.70\\moq.4.20.70.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\nuget.frameworks\\6.5.0\\nuget.frameworks.6.5.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\system.collections.immutable\\1.5.0\\system.collections.immutable.1.5.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\4.5.3\\system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\system.threading.tasks.extensions\\4.5.4\\system.threading.tasks.extensions.4.5.4.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit\\2.6.2\\xunit.2.6.2.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.abstractions\\2.0.3\\xunit.abstractions.2.0.3.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.analyzers\\1.6.0\\xunit.analyzers.1.6.0.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.assert\\2.6.2\\xunit.assert.2.6.2.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.core\\2.6.2\\xunit.core.2.6.2.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.extensibility.core\\2.6.2\\xunit.extensibility.core.2.6.2.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.extensibility.execution\\2.6.2\\xunit.extensibility.execution.2.6.2.nupkg.sha512",
"C:\\Users\\COMPUTER1\\.nuget\\packages\\xunit.runner.visualstudio\\2.5.4\\xunit.runner.visualstudio.2.5.4.nupkg.sha512"
],
"logs": []
}

1
leak_test_project.slnx

@ -1,4 +1,3 @@
<Solution> <Solution>
<Project Path="leak_test_project.Tests/leak_test_project.Tests.csproj" />
<Project Path="leak_test_project/leak_test_project.csproj" Id="e02e2608-51f9-4338-b1a6-e6ac94362aae" /> <Project Path="leak_test_project/leak_test_project.csproj" Id="e02e2608-51f9-4338-b1a6-e6ac94362aae" />
</Solution> </Solution>

4
leak_test_project/App.xaml

@ -10,9 +10,7 @@
<DataTemplate DataType="{x:Type viewmodels:HomeViewModel}"> <DataTemplate DataType="{x:Type viewmodels:HomeViewModel}">
<views:HomeView/> <views:HomeView/>
</DataTemplate> </DataTemplate>
<DataTemplate DataType="{x:Type viewmodels:InOutViewModel}">
<views:InOutView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodels:DataViewModel}"> <DataTemplate DataType="{x:Type viewmodels:DataViewModel}">
<views:DataView/> <views:DataView/>
</DataTemplate> </DataTemplate>

27
leak_test_project/Infrastructure/DioBoardBase.cs

@ -60,18 +60,26 @@ namespace leak_test_project.Infrastructure
var config = DioConfigParser.LoadDefault(); var config = DioConfigParser.LoadDefault();
if (config != null) if (config != null)
{ {
int bitIndex = 0; int defaultBitIndex = 0;
foreach (var p in config.InputPoints) foreach (var p in config.InputPoints)
{ {
p.BitIndex = bitIndex++; if (p.BitIndex < 0)
{
p.BitIndex = defaultBitIndex;
}
_inputs[p.Name] = p; _inputs[p.Name] = p;
defaultBitIndex++;
} }
bitIndex = 0; defaultBitIndex = 0;
foreach (var p in config.OutputPoints) foreach (var p in config.OutputPoints)
{ {
p.BitIndex = bitIndex++; if (p.BitIndex < 0)
{
p.BitIndex = defaultBitIndex;
}
_outputs[p.Name] = p; _outputs[p.Name] = p;
defaultBitIndex++;
} }
ushort cardType = GetCardTypeFromConfig(config.BoardType); ushort cardType = GetCardTypeFromConfig(config.BoardType);
@ -130,11 +138,6 @@ namespace leak_test_project.Infrastructure
if (_cardNumber < 0) return false; if (_cardNumber < 0) return false;
if (_inputs.TryGetValue(pointName, out var point)) if (_inputs.TryGetValue(pointName, out var point))
{
// Find port and line mathematically (Wait, actually we should use DIO port mapping)
// Assuming simple 1-to-1 mapping where index == line in Port 0.
int index = new List<DioPoint>(_inputs.Values).IndexOf(point);
if (index >= 0)
{ {
ushort port = 0; // Usually port 0 for first 32 lines. ushort port = 0; // Usually port 0 for first 32 lines.
uint readValue; uint readValue;
@ -142,12 +145,11 @@ namespace leak_test_project.Infrastructure
short ret = DASK.DI_ReadPort((ushort)_cardNumber, port, out readValue); short ret = DASK.DI_ReadPort((ushort)_cardNumber, port, out readValue);
if (ret >= 0) if (ret >= 0)
{ {
bool isOn = (readValue & (1U << index)) != 0; bool isOn = (readValue & (1U << point.BitIndex)) != 0;
point.Value = isOn; point.Value = isOn;
return isOn; return isOn;
} }
} }
}
return false; return false;
} }
@ -224,12 +226,14 @@ namespace leak_test_project.Infrastructure
else else
{ {
FileLogger.Log("ERROR", $"[RealDioBoard] DI_ReadPort Error: {ret}"); FileLogger.Log("ERROR", $"[RealDioBoard] DI_ReadPort Error: {ret}");
ErrorOccurred?.Invoke(this, $"DI_ReadPort Error: {ret}");
} }
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
FileLogger.Log("ERROR", $"[RealDioBoard] Inner Polling Error: {ex.Message}"); FileLogger.Log("ERROR", $"[RealDioBoard] Inner Polling Error: {ex.Message}");
ErrorOccurred?.Invoke(this, $"Inner Polling Error: {ex.Message}");
} }
// 10ms polling rate (approx) // 10ms polling rate (approx)
@ -243,6 +247,7 @@ namespace leak_test_project.Infrastructure
catch (Exception ex) catch (Exception ex)
{ {
FileLogger.Log("ERROR", $"[RealDioBoard] Critical Polling Loop Error: {ex.Message}"); FileLogger.Log("ERROR", $"[RealDioBoard] Critical Polling Loop Error: {ex.Message}");
ErrorOccurred?.Invoke(this, $"Critical Polling Loop Error: {ex.Message}");
} }
} }

9
leak_test_project/MainWindow.xaml

@ -37,7 +37,7 @@
" FontWeight="SemiBold" VerticalAlignment="Center"/> " FontWeight="SemiBold" VerticalAlignment="Center"/>
</Border> </Border>
<Border Background="#34495E" CornerRadius="4" Padding="15,5" BorderBrush="#1A252F" BorderThickness="1"> <Border Background="#34495E" CornerRadius="4" Padding="15,5" BorderBrush="#1A252F" BorderThickness="1">
<TextBlock Text="Ver. 1.0.0 | Updated 2026-04-03" Foreground="#BDC3C7" FontSize="11" VerticalAlignment="Center"/> <TextBlock Text="Ver. 1.0.0 | Updated 2026-06-05" Foreground="#BDC3C7" FontSize="11" VerticalAlignment="Center"/>
</Border> </Border>
</StackPanel> </StackPanel>
@ -85,12 +85,7 @@
</Style> </Style>
</StackPanel.Resources> </StackPanel.Resources>
<Button Command="{Binding NavigateInOutCommand}">
<StackPanel>
<TextBlock Text="I/O Monitor" FontSize="14"/>
<TextBlock Text="(입출력 감시)" FontSize="10" FontWeight="Normal" Foreground="#566573"/>
</StackPanel>
</Button>
<Button Command="{Binding NavigateDataCommand}"> <Button Command="{Binding NavigateDataCommand}">
<StackPanel> <StackPanel>
<TextBlock Text="Data" FontSize="14"/> <TextBlock Text="Data" FontSize="14"/>

1
leak_test_project/Manual/.obsidian/app.json

@ -0,0 +1 @@
{}

1
leak_test_project/Manual/.obsidian/appearance.json

@ -0,0 +1 @@
{}

33
leak_test_project/Manual/.obsidian/core-plugins.json

@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}

195
leak_test_project/Manual/.obsidian/workspace.json

@ -0,0 +1,195 @@
{
"main": {
"id": "bdcb735517a920dd",
"type": "split",
"children": [
{
"id": "1004ab57097e9235",
"type": "tabs",
"children": [
{
"id": "7fc461cd97381c41",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "사용자_메뉴얼.md",
"mode": "preview",
"source": false
},
"icon": "lucide-file",
"title": "사용자_메뉴얼"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "2e4e71c5c1858ec4",
"type": "split",
"children": [
{
"id": "beb962e7e6c0ac7c",
"type": "tabs",
"children": [
{
"id": "a6ef93547d5bbdc1",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "파일 탐색기"
}
},
{
"id": "10dab2b10fa08801",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "검색"
}
},
{
"id": "452f34c59a28f45c",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "북마크"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "eadd0f1c493e33d9",
"type": "split",
"children": [
{
"id": "5d0a60c9c4490c31",
"type": "tabs",
"children": [
{
"id": "43b8c28e380bc273",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "03_메인_화면.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "03_메인_화면 의 백링크"
}
},
{
"id": "456528a5cb6653ad",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "03_메인_화면.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "03_메인_화면 의 나가는 링크"
}
},
{
"id": "347f5258266c83f8",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "태그"
}
},
{
"id": "23de7f7f47e4e8ec",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "모든 속성"
}
},
{
"id": "3dd6cfeeda44db3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "03_메인_화면.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "03_메인_화면 의 개요"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:빠른 전환기 열기": false,
"graph:그래프 뷰 열기": false,
"canvas:새 캔버스 만들기": false,
"daily-notes:오늘의 일일 노트 열기": false,
"templates:템플릿 삽입": false,
"command-palette:명령어 팔레트 열기": false,
"bases:새 베이스 생성하기": false
}
},
"active": "7fc461cd97381c41",
"lastOpenFiles": [
"10_오류_대응.md",
"09_로그_관리.md",
"03_메인_화면.md",
"02_초기_설정.md",
"01_시스템_개요.md",
"사용자_메뉴얼.md"
]
}

121
leak_test_project/Manual/01_시스템_개요.md

@ -0,0 +1,121 @@
# 1. 시스템 개요 및 요구사항
[← 메뉴얼 목차로 돌아가기](사용자_메뉴얼.md)
---
## 1.1 시스템 개요
**Pressure Leak Inspect System**은 제품의 압력 누설(Leak)을 자동으로 검사하는 WPF 기반 데스크탑 애플리케이션입니다. 생산 라인에서 DIO 시작 신호를 받아 제품 ID를 판독하고, 누설 시험을 수행한 뒤 합격/불합격을 자동 판정합니다.
### 주요 기능 요약
| 기능 | 설명 |
|------|------|
| **좌/우 2채널 관리** | LEFT / RIGHT 두 개의 독립적인 시험 채널을 운영합니다 |
| **자동 시험 프로세스** | DIO 시작 신호 감지 → ID 판독 → 누설 시험 → 판정 → 결과 출력까지 전 과정 자동화 |
| **Sentinel C28 연동** | RS-232 시리얼 통신으로 누설 센서의 실시간 측정값을 수신합니다 |
| **4251 보드 연동** | 제품 ID(ZMDI 센서) 판독을 위한 시리얼 통신을 수행합니다 |
| **PCI-7432 DIO 보드** | 디지털 입출력 제어 (시작 신호 수신, OK/NG 출력) |
| **실시간 I/O 모니터링** | 디지털 입출력 상태를 500ms 주기로 실시간 감시합니다 |
| **검사 기록 관리** | 날짜/판정/ID별 필터링 검색 및 CSV 파일 내보내기를 지원합니다 |
| **SPEC 교차 검증** | 프로그램 판정과 센서 자체 판정을 비교하여 불일치 시 경고합니다 |
| **순차 실행 보장** | 세마포어 잠금으로 좌/우 채널 동시 시험을 방지합니다 |
---
## 1.2 소프트웨어 요구사항
| 항목 | 요구사항 | 비고 |
|------|----------|------|
| **운영체제** | Windows 10 이상 (64bit 권장) | 32bit도 지원 가능 |
| **.NET Framework** | 4.7.2 이상 | Windows 10에 기본 포함 |
| **드라이버** | ADLINK PCIS-DASK 드라이버 | `PCI-Dask.dll` 필요 |
| **시리얼 포트** | 최소 2개의 COM 포트 | C28 센서용 + 4251 보드용 |
| **화면 해상도** | 1024×768 이상 | 최대화 실행 시 1920×1080 권장 |
> **참고**: ADLINK 드라이버가 설치되지 않은 환경에서는 프로그램이 **시뮬레이션 모드**로 자동 전환됩니다. 이 경우 DIO 입출력은 동작하지 않지만, 프로그램의 나머지 기능은 정상적으로 사용할 수 있습니다.
---
## 1.3 하드웨어 구성
| 장비 | 모델명 | 용도 | 통신 방식 |
|------|--------|------|-----------|
| **DIO 보드** | ADLINK PCI-7432 | 디지털 입출력 (시작 신호 수신, OK/NG 결과 출력) | PCI 슬롯 장착 |
| **ID 판독 보드** | 4251 | 제품 ID 센서(ZMDI) 데이터 판독 | RS-232 시리얼 (COM 포트) |
| **누설 센서** | Sentinel C28 | 압력 누설량(sccm) 측정 | RS-232 시리얼 (COM 포트) |
### 케이블 연결도
```
┌─────────┐ RS-232 ┌────────────┐
│ PC │────────────────→│ Sentinel │
│ │ COM 포트1 │ C28 센서 │
│ │ └────────────┘
│ │ RS-232 ┌────────────┐
│ │────────────────→│ │
│ │ COM 포트2 │ 4251 보드 │
│ │ └────────────┘
│ │ PCI 슬롯 ┌────────────┐
│ │════════════════→│ ADLINK │
│ │ │ PCI-7432 │
└─────────┘ └────────────┘
```
---
## 1.4 DIO 신호 매핑
### 입력 신호 (Inputs) - PCI-7432
| 주소 | 신호명 | 동작 | 설명 |
|------|--------|------|------|
| 0 | `LEFT_START` | OFF→ON 감지 | 좌측 채널 시험 시작 트리거 |
| 1 | `RIGHT_START` | OFF→ON 감지 | 우측 채널 시험 시작 트리거 |
> **동작 원리**: 시작 신호가 OFF→ON으로 전환되는 순간(Rising Edge)을 감지하여 시험을 시작합니다.
### 출력 신호 (Outputs) - PCI-7432
| 주소 | 신호명 | 초기값 | 설명 |
|------|--------|--------|------|
| 0 | `LEFT_OK` | OFF | 좌측 합격 시 ON 출력 |
| 1 | `RIGHT_OK` | OFF | 우측 합격 시 ON 출력 |
| 2 | `PC_ON` | **ON** | PC 가동 상태 신호 (프로그램 실행 시 자동 ON) |
| 3 | `LEFT_NG` | OFF | 좌측 불합격 시 ON 출력 |
| 4 | `RIGHT_NG` | OFF | 우측 불합격 시 ON 출력 |
> **참고**: `PC_ON` 신호는 프로그램 시작 시 자동으로 ON이 되며, 프로그램 종료 시 자동으로 OFF됩니다. 이를 통해 외부 시스템이 PC의 가동 상태를 확인할 수 있습니다.
> **참고**: 시험이 시작되면 해당 채널의 OK/NG 출력이 모두 OFF로 초기화된 후, 판정 완료 시 해당 결과에 맞는 출력만 ON됩니다.
---
## 1.5 프로그램 창 구조 개요
프로그램은 3개의 영역으로 구성됩니다:
```
┌────────────────────────────────────────────────┐
│ 상단 타이틀 바 (프로그램명, 시간, 창 제어 버튼) │
├────────────────────────────────────────────────┤
│ │
│ 메인 콘텐츠 영역 │
│ (Home / I/O Monitor / Data View 전환) │
│ │
├────────────────────────────────────────────────┤
│ 하단 메뉴 바 (I/O Monitor, Data, Parameters, │
│ Comm. Settings, ID Test L/R) │
└────────────────────────────────────────────────┘
```
| 영역 | 높이 | 설명 |
|------|------|------|
| 상단 타이틀 바 | 55px | 프로그램 제목, 현재 시간, 버전 정보, 창 제어 버튼 |
| 메인 콘텐츠 | 가변 | 선택된 화면(Home/I-O/Data)이 표시되는 영역 |
| 하단 메뉴 바 | 75px | 화면 전환 및 설정 팝업 버튼 |
---
[다음: 초기 설정 가이드 →](02_초기_설정.md)

135
leak_test_project/Manual/02_초기_설정.md

@ -0,0 +1,135 @@
# 2. 초기 설정 가이드
[← 메뉴얼 목차로 돌아가기](사용자_메뉴얼.md)
---
## 2.1 설치 전 준비사항 체크리스트
프로그램을 실행하기 전에 아래 항목을 모두 확인하세요:
| # | 확인 항목 | 확인 방법 | 비고 |
|---|----------|----------|------|
| 1 | ADLINK PCIS-DASK 드라이버 설치 완료 | Windows 장치 관리자에서 PCI-7432 인식 확인 | 미설치 시 시뮬레이션 모드로 동작 |
| 2 | Sentinel C28 센서 시리얼 케이블 연결 | 장치 관리자 → 포트(COM & LPT)에서 COM 포트 번호 확인 | RS-232 케이블 사용 |
| 3 | 4251 보드 시리얼 케이블 연결 | 장치 관리자 → 포트(COM & LPT)에서 COM 포트 번호 확인 | RS-232 케이블 사용 |
| 4 | PCI-7432 DIO 보드 장착 | 장치 관리자에서 ADLINK PCI-7432 인식 확인 | PCI 슬롯에 장착 |
| 5 | COM 포트 번호 메모 | C28 센서와 4251 보드 각각의 COM 포트 번호를 기록 | 설정 시 필요 |
> **⚠️ 중요**: C28 센서와 4251 보드는 **서로 다른 COM 포트**에 연결해야 합니다. 동일한 포트를 지정하면 통신 충돌이 발생합니다.
---
## 2.2 프로그램 실행
### 실행 방법
1. `leak_test_project.exe` 파일을 **더블 클릭**하여 실행합니다.
2. 프로그램이 전체화면(Maximized) 모드로 시작됩니다.
### 최초 실행 시 자동 생성되는 파일
| 파일 | 위치 | 설명 |
|------|------|------|
| `config.xml` | 프로그램 실행 폴더 | 통신 포트, BaudRate, SPEC 값 등 모든 설정을 저장 |
| `Settings/DioConfig.ini` | Settings 하위 폴더 | DIO 보드 타입, 입출력 포인트 정의 |
### 프로그램 시작 시 자동 수행 동작
프로그램이 실행되면 아래 동작이 자동으로 수행됩니다:
```
프로그램 실행
├─ 1. DIO 보드 초기화 (PCI-7432 인식, 실패 시 시뮬레이션 모드)
├─ 2. PC_ON 출력 신호 ON (외부 시스템에 가동 상태 알림)
├─ 3. config.xml에서 설정값 로드
├─ 4. Sentinel C28 센서 시리얼 포트 연결 시도
├─ 5. 4251 보드 시리얼 포트 연결 시도
├─ 6. 자동 시험 프로세스 스레드 시작 (LEFT/RIGHT 각각)
└─ 7. 메인 화면(Home View) 표시
```
> **참고**: 시리얼 포트 연결에 실패하면 메인 화면의 **오류 메시지** 영역에 해당 오류가 표시됩니다. 이 경우 `Comm. Settings`에서 올바른 포트를 선택한 후 저장하면 자동으로 재연결됩니다.
---
## 2.3 최초 설정 순서 (Step-by-Step)
프로그램을 처음 사용할 때는 반드시 아래 순서로 설정을 진행하세요.
### Step 1: 통신 설정 (가장 먼저 수행)
> 하드웨어와의 통신이 설정되어야 이후 모든 기능이 정상 동작합니다.
1. 하단 메뉴 바에서 **`Comm. Settings (통신 설정)`** 버튼을 클릭합니다.
2. **통신 설정** 팝업 창이 메인 창 중앙에 표시됩니다.
**4251 보드 설정 (좌측 영역):**
| 설정 항목 | 설명 | 선택 방법 | 기본값 |
|-----------|------|----------|--------|
| `4251 BaudRate` | 통신 속도 | 드롭다운에서 선택 (9600/19200/38400/115200) | `115200` |
| `4251 Port` | COM 포트 | 드롭다운에서 연결된 포트 선택 | `COM3` |
**Sentinel C28 설정 (우측 영역):**
| 설정 항목 | 설명 | 선택 방법 | 기본값 |
|-----------|------|----------|--------|
| `Sensor BaudRate` | 통신 속도 | 드롭다운에서 선택 (9600/19200/38400/115200) | `9600` |
| `Sensor Port` | COM 포트 | 드롭다운에서 연결된 포트 선택 | `COM1` |
3. 모든 항목을 설정한 후 **`설정 저장`** 버튼을 클릭합니다.
4. "통신 설정이 저장되었습니다." 메시지가 표시되면 설정 완료입니다.
> **⚠️ 중요**: 저장 시 기존의 모든 시리얼 통신 연결이 해제되고, 새로운 설정으로 자동 재연결됩니다. 이 과정에서 진행 중인 시험이 있다면 중단될 수 있습니다.
> **참고**: COM 포트 목록에는 현재 PC에 물리적으로 연결된 시리얼 장치만 표시됩니다. 원하는 포트가 보이지 않으면:
> - USB-시리얼 케이블이 PC에 연결되어 있는지 확인
> - 장치 관리자에서 해당 포트의 드라이버가 정상 설치되었는지 확인
> - 다른 프로그램이 해당 포트를 점유하고 있지 않은지 확인
---
### Step 2: 시험 설정 (SPEC 규격값 입력)
1. 하단 메뉴 바에서 **`Parameters (시험 설정)`** 버튼을 클릭합니다.
2. **시험 설정** 팝업 창이 표시됩니다.
| 설정 항목 | 설명 | 입력 형식 | 기본값 |
|-----------|------|----------|--------|
| `SPEC UL (sccm)` | 누설 상한 규격값 | 소수점 포함 숫자 (예: `1.00`) | `1.00` |
| `SPEC LL (sccm)` | 누설 하한 규격값 | 소수점 포함 숫자 (예: `-1.00`) | `-1.00` |
3. 값을 입력한 후 **`설정 저장`** 버튼을 클릭합니다.
4. "파라미터 설정이 저장되었습니다." 메시지가 표시되면 완료입니다.
> **참고**: SPEC UL/LL 값은 좌/우 양쪽 채널에 **공통으로 적용**됩니다.
> **판정 기준**: `SPEC LL ≤ 측정값 ≤ SPEC UL` 이면 **OK**, 범위를 벗어나면 **NG**로 판정됩니다.
---
### Step 3: 동작 테스트 (선택사항)
모든 설정이 완료되면 하단 메뉴의 **`ID Test (L)`** 또는 **`ID Test (R)`** 버튼으로 간단한 동작 테스트를 수행할 수 있습니다.
1. **`ID Test (L)`** 버튼을 클릭합니다.
2. 좌측 채널의 진행 메시지가 순서대로 표시됩니다:
- `시험 시작``센서 정보 읽는 중``ID 테스트 완료` (또는 `ID 테스트 실패`)
3. 좌측 채널의 **ID / LOW ID** 영역에 읽은 제품 ID가 표시되면 정상입니다.
> **참고**: ID Test는 DIO 시작 신호 없이도 4251 보드의 센서 판독 기능만 단독으로 테스트합니다. 실제 LEAK 시험은 수행하지 않습니다.
---
## 2.4 설정 변경 시 주의사항
| 상황 | 동작 | 주의 |
|------|------|------|
| 통신 설정 저장 | 모든 시리얼 연결 해제 → 새 설정으로 재연결 | 시험 중 변경 시 시험 중단 |
| 시험 설정 저장 | 즉시 메인 화면의 SPEC 표시 갱신 | 진행 중인 시험에는 영향 없음 |
| 프로그램 재시작 | `config.xml`에서 마지막 저장된 설정 자동 로드 | 별도 작업 불필요 |
---
[← 이전: 시스템 개요](01_시스템_개요.md) | [다음: 메인 화면 →](03_메인_화면.md)

180
leak_test_project/Manual/03_메인_화면.md

@ -0,0 +1,180 @@
# 3. 메인 화면 (Home View)
[← 메뉴얼 목차로 돌아가기](사용자_메뉴얼.md)
---
프로그램 실행 시 기본으로 표시되는 화면입니다. 좌/우 채널의 누설 시험 결과를 실시간으로 모니터링합니다.
## 3.1 전체 화면 레이아웃
```
┌────────────────────────────────────────────────────────────────┐
│ Pressure Leak Inspect System 2026-05-08 [목] 10:30:00 ─□X │ ← 상단 타이틀 바
├─────────────────────────────┬──────────────────────────────────┤
│ LEFT LEAK TESTER │ RIGHT LEAK TESTER │
├─────────────────────────────┼──────────────────────────────────┤
│ 시작 시간 │ 2026-05-08 ... │ 시작 시간 │ 2026-05-08 ... │
│ ID/LOW ID │ ABC123 / 00FF │ ID/LOW ID │ DEF456 / 01AA │
│ 측정값 │ 0.5234 sccm │ 측정값 │ 0.3124 sccm │
│ │ SPEC UL: 1.00 │ │ SPEC UL: 1.00 │
│ │ SPEC LL: -1.00 │ │ SPEC LL: -1.00 │
│ 판정 │ OK │ 판정 │ OK │
│ 진행메시지 │ 시험 완료 │ 진행메시지│ 시험 완료 │
│ 오류메시지 │ │ 오류메시지│ │
├────────────────────────────────────────────────────────────────┤
│ [Data] [Parameters] [Comm.Settings] [IDL] [IDR] │ ← 하단 메뉴 바
└────────────────────────────────────────────────────────────────┘
```
---
## 3.2 상단 타이틀 바
프로그램 최상단에 위치한 짙은 남색(#2C3E50) 배경의 바입니다.
| 위치 | 요소 | 설명 |
|------|------|------|
| 좌측 | **프로그램 제목** | "Pressure Leak Inspect System" (백색, 24pt 볼드) |
| 중앙~우측 | **현재 날짜/시간** | `2026-05-08 [목] 10:30:00` 형식, 1초 주기로 실시간 갱신 |
| 우측 | **버전 정보** | `Ver. 1.0.0 | Updated 2026-04-03` (회색 텍스트) |
| 최우측 | **창 제어 버튼** | 최소화(─) / 최대화·복원(□) / 종료(X, 빨간색) |
### 타이틀 바 조작
| 조작 | 동작 |
|------|------|
| 타이틀 바 **드래그** | 창 이동 |
| 타이틀 바 **더블 클릭** | 최대화 ↔ 일반 크기 전환 |
| **─** 버튼 클릭 | 작업표시줄로 최소화 |
| **□** 버튼 클릭 | 최대화 ↔ 일반 크기 전환 (아이콘도 변경됨) |
| **X** 버튼 클릭 | 종료 확인 대화상자 표시 → "예" 선택 시 종료 |
---
## 3.3 메인 영역 - 채널 모니터링
화면은 좌측(`LEFT LEAK TESTER`)과 우측(`RIGHT LEAK TESTER`)으로 균등 분할되며, 각 채널은 동일한 구조입니다.
### 각 채널의 구성 요소 (위에서 아래 순서)
#### ① 채널 타이틀 (Row 0)
- **LEFT LEAK TESTER** 또는 **RIGHT LEAK TESTER**
- 짙은 남색(#34495E) 배경에 백색 볼드 텍스트 (20pt)
- 높이: 50px
#### ② 시작 시간 (Row 1)
| 항목 | 설명 |
|------|------|
| 라벨 | `시작 시간` (회색 헤더 배경) |
| 값 | `yyyy-MM-dd HH:mm:ss` 형식 (예: `2026-05-08 10:30:15`) |
| 갱신 시점 | 시험이 시작될 때마다 현재 시각으로 자동 갱신 |
| 높이 | 42px |
#### ③ ID / LOW ID (Row 2)
| 항목 | 설명 |
|------|------|
| 라벨 | `ID / LOW ID` (회색 헤더 배경) |
| 값 | `{제품ID} / {Low ID}` 형식으로 조합 표시 |
| 데이터 소스 | 4251 보드를 통해 ZMDI 센서에서 읽은 값 |
| 갱신 시점 | 시험 시작 시 초기화, 센서 판독 완료 시 표시 |
| 높이 | 42px |
#### ④ 측정값 + SPEC (Row 3) - **가장 큰 영역**
좌측에 측정값, 우측에 SPEC 규격이 함께 표시됩니다.
**측정값 영역:**
| 항목 | 설명 |
|------|------|
| 라벨 | `측정값` (18pt 볼드) |
| 값 | Sentinel C28에서 수신한 누설량 (소수점 4자리, 예: `0.5234`) |
| 단위 | `sccm` (우측 하단에 표시) |
| 폰트 크기 | **84pt** (매우 크게 표시하여 원거리에서도 확인 가능) |
| 색상 | 파란색(#2980B9) 볼드 |
| 갱신 시점 | C28 센서 스트리밍 데이터 수신 시 실시간 갱신 |
**SPEC 영역 (우측 210px):**
| 항목 | 설명 |
|------|------|
| `UL` | 상한 규격값 (예: `1.00`), 26pt 볼드 |
| `LL` | 하한 규격값 (예: `-1.00`), 26pt 볼드 |
| 갱신 시점 | Parameters에서 저장 시 즉시 반영 |
#### ⑤ 판정 (Row 4) - **두 번째로 큰 영역**
| 항목 | 설명 |
|------|------|
| 라벨 | `판정` (18pt 볼드) |
| 값 | **OK** 또는 **NG** (96pt, ExtraBold) |
| OK 표시 | 녹색 텍스트(#27AE60) + 연녹색 배경(#D4EFDF) |
| NG 표시 | 빨간색 텍스트(#C0392B) + 연빨간색 배경(#FADBD8) |
> **판정 기준**: `SPEC LL ≤ 측정값 ≤ SPEC UL`**OK**, 그 외 → **NG**
#### ⑥ 진행 메시지 (Row 5)
| 항목 | 설명 |
|------|------|
| 라벨 | `진행 메시지` (연파랑 배경) |
| 값 | 현재 시험 단계를 나타내는 텍스트 (22pt 볼드, 파란색) |
| 높이 | 60px |
표시되는 메시지 목록:
| 메시지 | 의미 |
|--------|------|
| `시험 시작` | DIO 시작 신호 감지, 시험 프로세스 시작 |
| `대기중` | 다른 채널이 시험 중이어서 순서 대기 |
| `센서 정보 읽는 중` | 4251 보드를 통해 ZMDI 센서 ID 판독 중 |
| `LEAK 시험중` | Sentinel C28 센서의 측정 결과 대기 중 |
| `시험 완료` | 판정 완료 및 결과 출력 완료 |
| `오류 발생` | 시험 중 오류 발생 (상세 내용은 오류 메시지 참조) |
| `ID 테스트 완료` | 수동 ID 테스트 정상 완료 |
| `ID 테스트 실패` | 수동 ID 테스트 실패 |
| `통신 대기 중` | 통신 설정 변경 후 재연결 대기 |
#### ⑦ 오류 메시지 (Row 6)
| 항목 | 설명 |
|------|------|
| 라벨 | `오류 메시지` (연주황 배경, 갈색 텍스트) |
| 값 | 오류 내용 (빨간색, 18pt 볼드). 스크롤 가능 |
| 특징 | 읽기 전용 텍스트 박스, 텍스트 줄바꿈 자동, 세로 스크롤바 |
| 초기화 시점 | 새 시험 시작 시 자동 초기화 |
---
## 3.4 SPEC 교차 검증 경고
프로그램의 판정 결과(SPEC UL/LL 기준)와 Sentinel C28 센서의 **자체 판정 결과**가 서로 다를 경우:
1. 해당 채널의 **오류 메시지** 영역에 `SPEC 불일치 - 프로그램: OK, 센서: R` 등의 메시지가 표시됩니다.
2. **팝업 경고 대화상자**가 표시됩니다: "프로그램 스팩과 센서의 스팩이 서로 맞지 않습니다."
> **조치**: 센서 측의 SPEC 설정과 프로그램의 SPEC UL/LL 설정이 동일한지 확인하세요.
---
## 3.5 하단 메뉴 바
프로그램 최하단의 연회색(#D5DBDB) 배경 영역입니다. 5개의 버튼이 좌측부터 수평으로 배치됩니다.
| 순서 | 버튼 텍스트 | 부제 | 동작 | 동작 방식 |
|------|------------|------|------|----------|
| 1 | **Data** | (측정 데이터) | 검사 기록 조회 화면 전환 | 토글 (다시 클릭 시 Home으로 복귀) |
| 2 | **Parameters** | (시험 설정) | 시험 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) |
| 3 | **Comm. Settings** | (통신 설정) | 통신 설정 팝업 창 열기 | 모달 팝업 (설정 후 자동 닫힘) |
| 4 | **ID Test (L)** | (좌측 ID 테스트) | 좌측 채널 센서 ID 수동 판독 | 즉시 실행 (파란색 텍스트) |
| 5 | **ID Test (R)** | (우측 ID 테스트) | 우측 채널 센서 ID 수동 판독 | 즉시 실행 (파란색 텍스트) |
### 버튼 스타일
- 크기: 140px × 55px
- 배경: 연회색(#F2F4F4), 마우스 오버 시 약간 어두워짐(#E5E8E8)
- 테두리: 회색(#85929E), 1.5px
- 텍스트: 14pt 볼드 (부제는 10pt 일반)
---
[← 이전: 초기 설정](02_초기_설정.md) | [다음: 통신 설정 →](04_통신_설정.md)

67
leak_test_project/Manual/04_통신_설정.md

@ -0,0 +1,67 @@
# 4. 통신 설정 (Comm. Settings)
[← 메뉴얼 목차로 돌아가기](사용자_메뉴얼.md)
---
하단 메뉴에서 **Comm. Settings (통신 설정)** 버튼 클릭 시 열리는 **모달 팝업 창**입니다.
## 4.1 창 구성
```
┌────────────────────────────────────────────────┐
│ COMMUNICATION SETTINGS │ ← 타이틀 바 (남색)
├──────────────────────┬─────────────────────────┤
│ [ 4251 보드 설정 ] │ [ Sentinel C28 설정 ] │
│ │ │
│ 4251 BaudRate ▼115200│ Sensor BaudRate ▼9600 │
│ 4251 Port ▼COM3 │ Sensor Port ▼COM1 │
│ │ │
├──────────────────────┴─────────────────────────┤
│ [ 설정 저장 ] [ 닫기 ] │ ← 하단 버튼 영역
└────────────────────────────────────────────────┘
```
| 속성 | 값 |
|------|-----|
| 창 크기 | 750px × 자동 높이 (최대 700px) |
| 크기 변경 | 불가 |
| 위치 | 메인 창 중앙 |
| 타입 | 모달 (이 창이 열려있으면 메인 창 조작 불가) |
## 4.2 4251 보드 설정 (좌측 영역)
| 항목 | UI 타입 | 선택 가능 값 | 기본값 | 설명 |
|------|---------|-------------|--------|------|
| **4251 BaudRate** | 드롭다운 | 9600 / 19200 / 38400 / 115200 | `115200` | 4251 보드 통신 속도. 보드 설정과 일치해야 함 |
| **4251 Port** | 드롭다운 | 시스템 감지 COM 포트 목록 | `COM3` | 4251 보드가 연결된 시리얼 포트 |
## 4.3 Sentinel C28 설정 (우측 영역)
| 항목 | UI 타입 | 선택 가능 값 | 기본값 | 설명 |
|------|---------|-------------|--------|------|
| **Sensor BaudRate** | 드롭다운 | 9600 / 19200 / 38400 / 115200 | `9600` | C28 센서 통신 속도. 센서 설정과 일치해야 함 |
| **Sensor Port** | 드롭다운 | 시스템 감지 COM 포트 목록 | `COM1` | C28 센서가 연결된 시리얼 포트 |
## 4.4 버튼 설명
| 버튼 | 색상 | 동작 |
|------|------|------|
| **설정 저장** | 연녹색 배경, 녹색 테두리 | config.xml에 저장 → 기존 연결 해제 → 새 설정으로 재연결 → "통신 설정이 저장되었습니다." 메시지 → 창 닫힘 |
| **닫기** | 기본 회색 | 변경 사항 저장하지 않고 창 닫기 |
## 4.5 저장 시 내부 동작 순서
1. 현재 선택된 값을 `config.xml`에 저장
2. 기존 Sentinel C28 시리얼 연결 해제
3. 기존 4251 보드 시리얼 연결 해제
4. 시험 프로세스 스레드 종료
5. 새 설정값으로 Sentinel C28 재연결
6. 새 설정값으로 4251 보드 재연결
7. 시험 프로세스 스레드 재시작
> **⚠️ 주의**: COM 포트를 동일하게 설정하면 충돌이 발생합니다. 4251 보드와 C28 센서는 반드시 다른 포트를 사용하세요.
---
[← 이전: 메인 화면](03_메인_화면.md) | [다음: 시험 설정 →](05_시험_설정.md)

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save