@ -6,42 +6,60 @@ Windows 기반 Air Leak Test 장비를 위한 제어 및 모니터링 GUI 프로
```text
```text
leak_test_project/
leak_test_project/
├── Infrastructure/ # 하드웨어 통신 계층 (Low-Level Communication)
├── Infrastructure/ # 하드웨어 통신 및 DIO 계층 (Low-Level Communication)
│ ├── ICommunication.cs # 통신 방식(Serial, TCP) 추상화 인터페이스
│ ├── ICommunication.cs # 통신 방식(Serial, TCP) 추상화 인터페이스
│ └── SerialProvider.cs # RS232 시리얼 통신 구현체 (8N1, IDisposable)
│ ├── SerialProvider.cs # RS232 시리얼 통신 구현체 (8N1, IDisposable)
│ ├── IDioBoard.cs # DIO 보드 추상화 인터페이스 (입출력 제어, 이벤트)
│ ├── RealDioBoard.cs # ADLINK PCI DIO 보드 실제 구현체 (10ms 폴링)
│ └── Dask.cs # ADLINK PCIS-DASK API P/Invoke 래퍼
├── Models/ # 데이터 모델
├── Models/ # 데이터 모델
│ ├── AppConfig.cs # 앱 설정 (Port, BaudRate, Spec UL/LL)
│ ├── AppConfig.cs # 앱 설정 (Left/Right/SensorPort, Zmdi/SensorBaudRate, SpecUL/LL)
│ ├── InOutItem.cs # I/O 항목 모델 (Address, Name, Description)
│ ├── DioPoint.cs # DIO 포인트 모델 (Name, IsInput, Value) + DioEventArgs
│ ├── InspectData.cs # 검사 결과 데이터 모델
│ ├── InOutItem.cs # I/O 항목 모델 (Address, Name, Description, Value)
│ └── ParsedData.cs # Sentinel C28 파싱 결과 모델
│ ├── InspectData.cs # 검사 결과 데이터 모델 (12개 필드)
│ ├── ParsedData.cs # Sentinel C28 파싱 결과 모델 (MeasuredValue, SensorJudgment 등)
│ └── SensorIdData.cs # ZMDI 센서 ID 데이터 모델 (LowID, Year/Month/Day, Serial 등)
├── Services/ # 비즈니스 로직 및 기기 제어
├── Services/ # 비즈니스 로직 및 기기 제어
│ ├── IoBoardService.cs # I/O 보드 서비스 (더미 데이터, LEFT/RIGHT 구분)
│ ├── DioBoardFactory.cs # DIO 보드 팩토리 (DioConfig.ini 기반 보드 생성)
│ └── SentinelC28Service.cs # Sentinel C28 프로토콜 (자동 재연결 포함)
│ ├── IoBoardService.cs # I/O 보드 서비스 (IDioBoard 연동, 상태 갱신/출력 제어)
│ ├── SentinelC28Service.cs # Sentinel C28 프로토콜 (자동 재연결 포함)
│ ├── TestProcessService.cs # 자동 시험 프로세스 (DIO→센서→시험→판정→출력 사이클)
│ └── ZmdiSensorService.cs # ZMDI 센서 시리얼 통신 (ID 읽기/파싱, 4단계 명령)
├── Utils/ # 유틸리티
├── Utils/ # 유틸리티
│ ├── ConfigManager.cs # XML 기반 설정 관리 (Load/Save)
│ ├── ConfigManager.cs # XML 기반 설정 관리 (Load/Save, ConfigChanged 이벤트 )
│ ├── CsvExporter.cs # 범용 CSV 내보내기
│ ├── CsvExporter.cs # 범용 CSV 내보내기
│ ├── DioConfigParser.cs # INI 형식 DIO 설정 파서 (보드 타입, 포인트 매핑)
│ ├── FileLogger.cs # 일일 CSV 로그 자동 저장 + 시스템 로그
│ ├── FileLogger.cs # 일일 CSV 로그 자동 저장 + 시스템 로그
│ ├── LogParser.cs # CSV 로그 파싱 및 검색 필터링
│ ├── LogParser.cs # CSV 로그 파싱 및 검색 필터링
│ ├── SentinelCrc8.cs # CRC-8 체크섬 계산
│ ├── SentinelCrc8.cs # CRC-8 체크섬 계산
│ └── SentinelParser.cs # C28 데이터 파싱 (스트리밍/최종결과)
│ └── 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채널 통신, 측정, 판정, 로그 기록
│ ├── HomeViewModel.cs # 2채널 자동 시험, ZMDI/C28 통신, SPEC 교차 검증
│ ├── InOutViewModel.cs # I/O 모니터 페이징 로직
│ ├── InOutViewModel.cs # I/O 모니터 페이징 로직
│ ├── MainViewModel.cs # 화면 전환 및 앱 생명주기 관리
│ ├── MainViewModel.cs # 화면 전환, DIO 보드 생성, 앱 생명주기 관리
│ └── ParametersViewModel.cs # 파라미터 설정 (예비 )
│ └── ParametersViewModel.cs # 파라미터 설정 (빈 클래스, 로직은 Window에서 직접 처리 )
├── Views/ # UI 화면
├── Views/ # UI 화면
│ ├── CommunicationWindow.xaml(.cs) # 통신 설정 (포트/보드레이트)
│ ├── CommunicationWindow.xaml(.cs) # 통신 설정 (포트/보드레이트)
│ ├── DataView.xaml(.cs) # 검사 이력 조회/검색/CSV 저장
│ ├── DataView.xaml(.cs) # 검사 이력 조회/검색/CSV 저장
│ ├── HomeView.xaml(.cs) # 좌/우 2채널 시험 모니터링
│ ├── HomeView.xaml(.cs) # 좌/우 2채널 시험 모니터링
│ ├── InOutView.xaml(.cs) # I/O 모니터 (LEFT/RIGH T 구분)
│ ├── InOutView.xaml(.cs) # I/O 모니터 (INPUT/OUTPU T 구분)
│ └── ParametersWindow.xaml(.cs) # SPEC UL/LL 설정
│ └── ParametersWindow.xaml(.cs) # SPEC UL/LL 설정
├── Manual/ # 사용자 매뉴얼
│ ├── Communication_Manual.md # 통신 설정 매뉴얼
│ ├── DataView_Manual.md # 데이터 조회 매뉴얼
│ ├── HomeView_Manual.md # 메인 화면 매뉴얼
│ ├── IO_Monitor_Manual.md # I/O 모니터 매뉴얼
│ └── Parameter_Manual.md # 파라미터 설정 매뉴얼
├── 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)
```
```
## ✨ 주요 기능
## ✨ 주요 기능
@ -50,64 +68,91 @@ leak_test_project/
- 좌(LEFT) / 우(RIGHT) 독립 2채널 기밀 시험 상태 실시간 표시
- 좌(LEFT) / 우(RIGHT) 독립 2채널 기밀 시험 상태 실시간 표시
- 측정값(sccm), SPEC 범위(UL/LL), 판정(OK/NG) 실시간 확인
- 측정값(sccm), SPEC 범위(UL/LL), 판정(OK/NG) 실시간 확인
- 판정 결과에 따른 배경색 자동 변경 (OK=녹색, NG=빨간색)
- 판정 결과에 따른 배경색 자동 변경 (OK=녹색, NG=빨간색)
- 하단 제품/센서 통신 로그 출력 (최대 500줄 유지, 자동 스크롤)
- 좌/우 채널별 상태(Status) 및 오류(Error) 메시지 표시
- ZMDI 센서 ID 정보 (LowID, 제조일, 시리얼, 라인, 제품 구분) 실시간 표시
### 2. Sentinel C28 통신 제어
- **RS-232 시리얼 통신** : 기본 115200 baud, 8N1
### 2. 자동 시험 프로세스 (TestProcessService)
DIO 시작 신호를 기반으로 좌/우 독립 백그라운드 스레드에서 아래 사이클을 반복합니다:
1. **DIO 시작 신호 대기** : LEFT_START / RIGHT_START 입력 신호 OFF→ON 감지
2. **ZMDI 센서 ID 읽기** : 4단계 시리얼 명령 시퀀스로 제품 ID 파싱
3. **불량 제품 필터링** : 센서의 이전 검사 결과(PrevResult) 확인
4. **LEAK 시험 수행** : Sentinel C28 최종 결과 수신 대기 (30초 타임아웃)
5. **판정** : 프로그램 SPEC(UL/LL) 기반 OK/NG 판정
6. **SPEC 교차 검증** : 프로그램 판정과 센서 자체 판정(A/R) 비교, 불일치 시 경고
7. **로그 기록** : 일일 CSV 파일에 검사 결과 자동 저장
8. **DIO 출력** : 판정 결과에 따라 OK/NG 출력 신호 전송
### 3. DIO 보드 제어 (ADLINK PCI)
- **ADLINK PCI DIO 보드** 연동 (PCIS-DASK API 사용)
- **INI 설정 기반** 입출력 포인트 매핑 (`Settings/DioConfig.ini`)
- **10ms 입력 폴링** : 백그라운드 Task에서 입력 상태 주기적 감시
- **PC_ON 출력** : 프로그램 시작 시 가동 신호 ON, 종료 시 OFF
- **지원 보드 타입** : PCI_7230, PCI_7432, PCI_7433, PCI_7434, PCI_7250
### 4. Sentinel C28 통신 제어
- **RS-232 시리얼 통신** : 기본 9600 baud, 8N1
- **표준 프로토콜 준수** : 헤더(XXYYZZZ H) + CRC-8 체크섬 자동 생성
- **표준 프로토콜 준수** : 헤더(XXYYZZZ H) + CRC-8 체크섬 자동 생성
- **다중 데이터 처리** : 최종 결과(R), 실시간 스트리밍(S), 메시지(M) 구분 수신
- **다중 데이터 처리** : 최종 결과(R), 실시간 스트리밍(S), 메시지(M) 구분 수신
- **자동 재연결** : 연결 끊김 시 5초 간격 자동 재연결 시도
- **자동 재연결** : 연결 끊김 시 **1초(1000ms) 간격**으로 모든 통신(C28, ZMDI)의 자동 복구를 시도하여 사용자 개입 최소화
- **확장성** : ICommunication 인터페이스 기반으로 TCP/IP 등 통신 방식 변경 가능
- **확장성** : ICommunication 인터페이스 기반으로 TCP/IP 등 통신 방식 변경 가능
### 3. 입출력 모니터 (In/Out Monitor)
### 5. 입출력 모니터 (In/Out Monitor)
- INPUT / OUTPUT 신호 상태 확인 (LEFT/RIGHT 구분)
- INPUT / OUTPUT 신호 상태 확인 (실제 DIO 보드 연동)
- **500ms 주기 자동 갱신** : 별도의 새로고침 버튼 없이 DIO 상태가 실시간 업데이트
- 페이지당 30개씩 데이터 표시 및 페이징 기능 (FIRST/PREV/NEXT/LAST)
- 페이지당 30개씩 데이터 표시 및 페이징 기능 (FIRST/PREV/NEXT/LAST)
- 화면 닫기(Close) 시 자동 갱신 타이머 정지
### 4. 데이터 이력 조회 (Data)
### 6 . 데이터 이력 조회 (Data)
- 기간별, 판정 결과별(OK/NG/전체), 시리얼 번호별 필터링 검색
- 기간별, 판정 결과별(OK/NG/전체), 시리얼 번호별 필터링 검색
- 일일 CSV 로그 자동 저장 (검사 완료 시 `Logs/yyyy-MM-dd.csv` 에 즉시 기록)
- 일일 CSV 로그 자동 저장 (검사 완료 시 `Logs/yyyy-MM-dd.csv` 에 즉시 기록)
- 조회된 데이터를 별도 CSV 파일로 내보내기 가능
- 조회된 데이터를 별도 CSV 파일로 내보내기 가능
- 빈 화면에서도 엑셀 시트처럼 항상 표 격자(GridLines)가 유동적으로 유지되도록 표출 전용 패딩 적용
- 빈 화면에서도 엑셀 시트처럼 항상 표 격자(GridLines)가 유동적으로 유지되도록 최소 50행 표출
- 로그 파일이 없는 경우 더미 데이터 자동 생성
- 테스트용 더미 데이터 수동 로드 기능 (버튼 클릭으로 10건 샘플 데이터 생성)
### 5. 설정 관리
### 7 . 설정 관리
- **파라미터 설정** : SPEC UL/LL (sccm) 값 설정 및 저장
- **파라미터 설정** : SPEC UL/LL (sccm) 값 설정 및 저장
- **통신 설정** : 좌/우 메인(ZMDI) 장비 포트와 센서(Leak Sensor) 포트의 통신 속도를 각각 독립적으로 분리 설정 (ZMDI 기본 19200, 센서 기본 9600)
- **통신 설정** : 좌/우 ZMDI 장비 포트(기본 COM9/COM8, 보드레이트 공유 19200)와 센서 포트(기본 COM1, 보드레이트 9600)를 각각 독립 설정
- **XML 설정 파일** : `config.xml` 에 자동 저장/로드, 설정 변경 시 실시간 반영
- **XML 설정 파일** : `config.xml` 에 자동 저장/로드, 설정 변경 시 `ConfigChanged` 이벤트를 통해 모든 통신 서비스(Sentinel C28, ZMDI 센서)와 자동 시험 프로세스가 재시작되어 즉시 반영
- **DIO 설정 파일** : `Settings/DioConfig.ini` 에서 보드 타입, 입출력 포인트 이름/설명 관리
### 6 . 일일 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, Mode, LineNo, ProductType, SpecUL, SpecLL, Retest
- CSV 값 이스케이프 처리 (쉼표/따옴표/줄바꿈 안전 처리)
- CSV 값 이스케이프 처리 (쉼표/따옴표/줄바꿈 안전 처리)
- 시스템 텍스트 로그는 `yyyy-MM-dd_system.log` 로 별도 관리
- 시스템 텍스트 로그는 `yyyy-MM-dd_system.log` 로 별도 관리
### 7 . 프로그램 안정성
### 9 . 프로그램 안정성
- 프로그램 종료 전 확인 대화상자 표시
- 프로그램 종료 전 확인 대화상자 표시
- 시리얼 포트, 타이머 등 리소스 종료 시 안전 해제
- 시리얼 포트, DIO 보드, 타이머 등 리소스 종료 시 안전 해제 (IDisposable 패턴)
- 모든 통신/파일 I/O 구간에 예외 처리 적용
- 모든 통신/파일 I/O 구간에 예외 처리 적용
- UI 로그 메모리 누수 방지 (최대 500줄 제한)
- ZMDI 통신 명령 실패 시 최대 3회 재시도
- **포트 연결 알림** : 프로그램 초기화 또는 설정 변경 시 모든 포트(C28, ZMDI Left/Right)의 연결 상태를 즉시 확인하고, 하나라도 실패 시 메인 화면 오류 영역에 즉시 표시 (상세 오류 원인 및 포트 번호 포함)
- **1초 자동 복구** : 모든 통신 포트에 대해 1초 주기로 상시 자동 재연결 시도 (재진입 방지 포함)
- **통신 설정 변경 반영** : 설정 저장 시 즉시 통신 포트와 자동 시험 프로세스를 재시작하여 프로그램 재시작 없이 설정 변경 내용 적용 가능
## 📡 기기 통신 프로토콜 및 명령어 (Command Details)
## 📡 기기 통신 프로토콜 및 명령어 (Command Details)
프로그램에서 사용하는 주요 하드웨어 통신 명령어 및 절차입니다.
프로그램에서 사용하는 주요 하드웨어 통신 명령어 및 절차입니다.
### 1. ZMDI 센서 (ID 읽기 및 파싱)
### 1. ZMDI 센서 (ID 읽기 및 파싱)
ZMDI 센서와의 통신은 `19200 Baud, 8N1` 시리얼 통신을 사용하며, 총 4단계의 명령어 시퀀스로 구성됩니다. 모든 명령어는 `\r\n` 을 포함하여 전송됩 니다.
ZMDI 센서와의 통신은 `19200 Baud, 8N1` 시리얼 통신을 사용하며, 총 4단계의 명령어 시퀀스로 구성됩니다. 모든 명령어는 `\r\n` 을 포함하여 전송되며, 최대 3회 재시도합 니다.
| 단계 | 역할 | 주요 명령어 리스트 |
| 단계 | 역할 | 주요 명령어 리스트 |
| :--- | :--- | :--- |
| :--- | :--- | :--- |
| **1단계** | 초기화 및 통신 확인 | `V` , `Pr_D7` , `Pr_D6` , `Pr_D5` , `r` |
| **1단계** | 초기화 및 통신 확인 | `V` , `Pr_D7` , `Pr_D6` , `Pr_D5` , `r` |
| **2단계** | 메모리 접근 준비 | `tso31150` |
| **2단계** | 메모리 접근 준비 | `tso31150` |
| **3단계** | 데이터 수집 설정 | `os_10` , `t11005` , `OWT7800272D1` , `OR_78002` , `OW_78003... ` |
| **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` 등 |
| **4단계** | ID 메모리 읽기 | `OW_7800140` , `OR_78002` , `OW_7800141` , `OR_78002` , `OW_7800142` , `OR_78002` , `x9c_990:x` |
- **읽기 종료** : 모든 데이터를 읽은 후 `x9c_990:x` 명령으로 세션을 종료합니다.
- **읽기 종료** : 모든 데이터를 읽은 후 `x9c_990:x` 명령으로 세션을 종료합니다.
- **데이터 파싱** : `OR_78002` 의 응답값들을 조합하여 12자리 이상의 `LowID` 를 생성하고, 이를 디코딩 테이블에 따라 년/월/일/시리얼/라인/아이템 정보를 추출합니다.
- **데이터 파싱** : `OR_78002` 의 응답값들을 조합하여 12자리 이상의 `LowID` 를 생성하고, 이를 디코딩 테이블에 따라 년/월/일/시리얼/라인/아이템 정보를 추출합니다.
- **불량 필터링** : 파싱된 `PrevResult` 필드로 이전 검사 결과를 확인하여 불량 제품을 필터링합니다.
---
---
### 2. Sentinel C28 (Leak Test 장비)
### 2. Sentinel C28 (Leak Test 장비)
Sentinel C28과의 통신은 `1152 00 Baud, 8N1` 시리얼 통신을 사용하며, 전용 바이너리/텍스트 혼합 프로토콜을 사용합니다.
Sentinel C28과의 통신은 `96 00 Baud, 8N1` 시리얼 통신을 사용하며, 전용 바이너리/텍스트 혼합 프로토콜을 사용합니다.
- **명령어 구조** : `[CRC-8][Sequence][Length] [Type][Command]\r\n`
- **명령어 구조** : `[CRC-8][Sequence][Length] [Type][Command]\r\n`
- `CRC-8` : 헤더와 페이로드를 포함한 8비트 체크섬 (2자리 Hex)
- `CRC-8` : 헤더와 페이로드를 포함한 8비트 체크섬 (2자리 Hex)
@ -120,6 +165,31 @@ Sentinel C28과의 통신은 `115200 Baud, 8N1` 시리얼 통신을 사용하며
- `R (Result)` : 최종 검사 완료 후 수신되는 결과 데이터 (채널#, 시리얼, 측정값, 판정 등 포함)
- `R (Result)` : 최종 검사 완료 후 수신되는 결과 데이터 (채널#, 시리얼, 측정값, 판정 등 포함)
- `S (Streaming)` : 시험 진행 중 실시간으로 수신되는 압력/유량 데이터
- `S (Streaming)` : 시험 진행 중 실시간으로 수신되는 압력/유량 데이터
- **SPEC 교차 검증** : C28 센서의 자체 판정(A=Accept, R=Reject)과 프로그램의 UL/LL 기반 판정을 비교하여 불일치 시 경고 메시지를 표시합니다.
---
### 3. ADLINK DIO 보드
ADLINK PCI DIO 보드와의 통신은 PCIS-DASK API(PCI-Dask.dll)를 사용합니다.
- **설정 파일** : `Settings/DioConfig.ini` (INI 형식)
- `[DIO]` : CompanyName
- `[BOARD_1]` : BoardType, BoardNumber
- `[BOARD_1_IN]` : 입력 포인트 매핑 (LEFT_START, RIGHT_START 등)
- `[BOARD_1_OUT]` : 출력 포인트 매핑 (LEFT_OK, RIGHT_OK, LEFT_NG, RIGHT_NG, PC_ON 등)
- **기본 입출력 신호** :
| 구분 | 포인트 이름 | 설명 |
| :--- | :--- | :--- |
| INPUT | `LEFT_START` | 좌측 시험 시작 신호 |
| INPUT | `RIGHT_START` | 우측 시험 시작 신호 |
| OUTPUT | `LEFT_OK` | 좌측 합격 출력 |
| OUTPUT | `RIGHT_OK` | 우측 합격 출력 |
| OUTPUT | `LEFT_NG` | 좌측 불합격 출력 |
| OUTPUT | `RIGHT_NG` | 우측 불합격 출력 |
| OUTPUT | `PC_ON` | PC 가동 신호 |
---
---
## 🛠 유지보수 가이드
## 🛠 유지보수 가이드
@ -129,8 +199,23 @@ Sentinel C28과의 통신은 `115200 Baud, 8N1` 시리얼 통신을 사용하며
- **CRC 알고리즘** : 제조사 사양서에 정확한 다항식이 명시되어 있다면 `Utils/SentinelCrc8.cs` 교체 필요
- **CRC 알고리즘** : 제조사 사양서에 정확한 다항식이 명시되어 있다면 `Utils/SentinelCrc8.cs` 교체 필요
- **화면 및 스타일** : `Views/` 의 `.xaml` 파일과 `App.xaml` 에서 통합 관리
- **화면 및 스타일** : `Views/` 의 `.xaml` 파일과 `App.xaml` 에서 통합 관리
- **설정 항목 추가** : `Models/AppConfig.cs` 에 프로퍼티 추가 후 해당 설정 화면 UI 수정
- **설정 항목 추가** : `Models/AppConfig.cs` 에 프로퍼티 추가 후 해당 설정 화면 UI 수정
- **DIO 포인트 변경** : `Settings/DioConfig.ini` 에서 입출력 포인트 이름/설명을 수정하면 프로그램 재시작 시 반영
- **DIO 보드 타입 추가** : `Infrastructure/RealDioBoard.cs` 의 `GetCardTypeFromConfig()` 메서드에 새 보드 타입 매핑 추가
- **시험 프로세스 수정** : `Services/TestProcessService.cs` 의 `ProcessProc()` 메서드에서 시험 단계 추가/변경
- **ZMDI 명령 시퀀스 수정** : `Services/ZmdiSensorService.cs` 의 `_commandList1~4` 배열 수정
- **ID 디코딩 테이블 수정** : `Services/ZmdiSensorService.cs` 의 `_yearHexList` , `_monthList` , `_dayHexList` 등 업데이트
- **사용자 매뉴얼** : `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` 를 실행합니다.
3. 로그 파일은 실행 파일과 동일한 경로의 `Logs/` 폴더에 자동 생성됩니다.
3. 로그 파일은 실행 파일과 동일한 경로의 `Logs/` 폴더에 자동 생성됩니다.
4. DIO 설정 파일은 `Settings/DioConfig.ini` 에 자동 생성됩니다 (없을 경우 기본값으로 생성).