# V2G EXI Decoder - 빌드 가이드

## 프로젝트 구조

```
V2GDecoderC/
├── DotNet/          # .NET Core 버전
├── VC/              # Visual Studio 2022 버전 (Windows MSBuild)
├── C++/             # GCC 버전 (크로스 플랫폼)
└── Sample/          # 테스트 파일들
```

## 지원 플랫폼

- **Windows**: .NET Core, MSVC (VC2022), GCC (MinGW/MSYS2)
- **Linux**: .NET Core, GCC
- **macOS**: .NET Core, Clang/GCC

## 자동 빌드 (권장)

### Windows
```cmd
build_all.bat
```

### Linux/macOS  
```bash
./build_all.sh
```

## 개별 프로젝트 빌드

### 1. .NET Core 버전 (DotNet/)
```bash
# Windows
cd DotNet
build.bat

# Linux/macOS
cd DotNet
./build.sh

# 또는 직접 명령어
dotnet build DotNet/V2GDecoderNet.csproj -c Release
dotnet run --project DotNet/V2GDecoderNet.csproj Sample/test5.exi
```

### 2. VC2022 버전 (VC/) - Windows 전용
```cmd
# Windows MSBuild 사용
cd VC
build.bat

# 또는 Visual Studio에서 VC/V2GDecoderC.sln 열어서 빌드

# Linux에서는 GCC 대체 빌드
cd VC  
./build.sh
```

### 3. C++ GCC 버전 (C++/) - 크로스 플랫폼
```bash
# Windows
cd C++
build.bat

# Linux/macOS
cd C++
./build.sh

# 또는 직접 명령어
cd C++
gcc -o V2GDecoder V2GDecoder.c src/*/*.c -I./src/codec -I./src/iso1 -I./src/iso2 -I./src/din -Wall -O2
```

## 테스트 실행

### 자동 테스트
```bash
# Windows
test_all.bat

# Linux/macOS
./test_all.sh
```

### 수동 테스트
```bash
# .NET 버전 테스트
dotnet run --project DotNet/V2GDecoderNet.csproj Sample/test5.exi

# C++ GCC 버전 테스트
C++/V2GDecoder Sample/test5.exi

# VC 버전 테스트 (Windows)
VC/x64/Debug/V2GDecoder.exe Sample/test5.exi

# 다양한 사용법
dotnet run --project DotNet/V2GDecoderNet.csproj -decode Sample/test5.exi  # XML만 출력
dotnet run --project DotNet/V2GDecoderNet.csproj -encode input.xml         # EXI 인코딩
```

## Roundtrip 테스트 (무손실 변환 검증)
```bash
# EXI → XML → EXI 완벽 변환 확인
dotnet run --project DotNet/V2GDecoderNet.csproj -decode Sample/test5.exi > temp/decoded.xml
dotnet run --project DotNet/V2GDecoderNet.csproj -encode temp/decoded.xml > temp/roundtrip.exi
cmp Sample/test5.exi temp/roundtrip.exi  # Linux - 완전 동일해야 함
fc /b Sample\test5.exi temp\roundtrip.exi  # Windows - 완전 동일해야 함
```

## 빌드 스크립트 목록

### 루트 디렉토리
- `build_all.bat` / `build_all.sh` - 모든 프로젝트 자동 빌드
- `test_all.bat` / `test_all.sh` - 모든 프로젝트 자동 테스트

### 각 프로젝트별 빌드 스크립트
- `DotNet/build.bat` / `DotNet/build.sh` - .NET 프로젝트 빌드
- `VC/build.bat` / `VC/build.sh` - VC2022/GCC 빌드
- `C++/build.bat` / `C++/build.sh` - C++ GCC 빌드

## 지원 파일 형식

- **test1.exi, test2.exi**: CurrentDemandRes (131바이트, 네트워크 패킷 포함)
- **test3.exi, test4.exi, test5.exi**: CurrentDemandReq (43바이트, 순수 EXI)
- **모든 ISO 15118-2 V2G 메시지**: 18개 메시지 타입 완전 지원

## 문제 해결

### Windows에서 GCC를 사용하려면
1. MSYS2 설치: https://www.msys2.org/
2. GCC 패키지 설치: `pacman -S mingw-w64-x86_64-gcc`
3. PATH에 MinGW bin 경로 추가

### Linux에서 .NET 설치
```bash
# Ubuntu/Debian
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install dotnet-sdk-8.0

# CentOS/RHEL
sudo dnf install dotnet-sdk-8.0
```

## 성능 정보

- **디코딩**: ~1ms per file
- **인코딩**: ~2ms per file  
- **Roundtrip 정확도**: 100% (test5.exi 검증 완료)
- **지원 메시지**: 18개 V2G 메시지 타입