# GLITCH 프로젝트 설명서 (WIZnet 포함)
GLITCH 프로젝트는 **FPGA(실험 데이터 생성/수집) + MCU(ESP32, 통신 브리지) + Ground Station(Python GUI)**로 구성된 텔레메트리/텔레커맨드 통합 시스템입니다.
- FPGA에서 생성한 실험 데이터를 안정적으로 수집
- MCU에서 데이터 패킷을 정렬/검증/전송
- 지상국에서 실시간 시각화 및 저장
- 지상국 명령(TC)을 다시 MCU/FPGA로 전달해 실험 모드 제어
결론: **이 프로젝트 MCU 경로에서 WIZnet W5500을 사용합니다.**
- W5500 초기화 함수: `MCU/ethernet_test/components/ethernet/ethernet.c`
- `init_wiz550io_eth()`
- `ETH_W5500_DEFAULT_CONFIG(...)`
- `esp_eth_mac_new_w5500(...)`
- `esp_eth_phy_new_w5500(...)`
- 실제 이더넷 초기화 진입점에서 W5500 초기화 호출:
- `ethernet_setup()` 내부 `init_wiz550io_eth()` 호출
즉, **ESP32 + SPI + W5500** 조합으로 Ethernet 인터페이스를 구성하고, TCP 서버를 통해 Ground Station과 통신합니다.
> 참고: 동일 파일에 내부 EMAC/IP101 계열 초기화 함수(`eth_init`)도 존재하지만, 현재 메인 초기화 경로는 `init_wiz550io_eth()`입니다.
```mermaid
flowchart LR
A[FPGA<br/>Sensor/GNSS/SRAM Bitflip Logic<br/>VHDL] -->|UART TM| B[MCU ESP32<br/>UART 수신 + 패킷 재포맷]
B -->|TCP Downlink<br/>W5500 Ethernet| C[Ground Station<br/>Python GUI]
C -->|TCP Uplink TC| B
B -->|UART TC 전달| A
B --> D[(SD Storage<br/>옵션)]
C --> E[(CSV/LOG 저장)]
```
```mermaid
sequenceDiagram
participant FPGA
participant MCU_UART as MCU UART Task
participant MCU_TCP as MCU TCP Server
participant GS as Ground Station
FPGA->>MCU_UART: UART 텔레메트리(HK/BF/RAD/ACK)
MCU_UART->>MCU_UART: ID 판별, 길이 체크, pack_tm(), CRC 처리
MCU_UART->>MCU_TCP: buffer_add_tm()로 전송 큐 적재
MCU_TCP->>GS: TCP send(TM packet)
GS->>GS: parse(), CRC 검증, 타입별 디코딩
GS->>GS: GUI 갱신(그래프/통계) + 로그 저장
```
```mermaid
sequenceDiagram
participant GS as Ground Station
participant MCU_TCP as MCU TCP Server
participant MCU_UART as MCU UART Task
participant FPGA
GS->>GS: build_telecommand(seq, tc_code), CRC 생성
GS->>MCU_TCP: TCP로 TC 패킷 전송
MCU_TCP->>MCU_TCP: unpack_tc(), CRC 검증
MCU_TCP->>MCU_TCP: format_ack()로 ACK 생성
MCU_TCP->>MCU_UART: buffer_add_tc(tc)
MCU_UART->>FPGA: UART로 TC code 송신
MCU_TCP->>GS: ACK 패킷 송신
```
## 6) 코드 기반 아키텍처 맵 (어떤 시퀀스가 어디에 있는가)
## A. Ground Station (Python)
- 진입점/앱 실행
- `ground_station/main.py`
- `TelemetryManager` 시작 + GUI 런치
- 네트워크 수신, 연결 재시도, 패킷 통계
- `ground_station/telemetry/telemetry_manager.py`
- TCP connect/recv 루프, 파싱 호출, 콜백 전달, 로그 처리
- 패킷 검증/파싱
- `ground_station/receiver/packet_parser.py`
- 길이 기반 타입 판별, CRC 검증, 필드 파싱
- 패킷 타입/필드 정의
- `ground_station/receiver/packet_structures.py`
- HK/BF/RAD/ACK 구조 정의
- GUI/시각화/명령 버튼
- `ground_station/gui/dashboard.py`
- HK/BF/RAD/ACK 패널, 그래프(온도/고도), TC 전송 UI
- 업링크 생성
- `ground_station/uplink/uplink_sender.py`
- TC 패킷 조립(시퀀스/CRC) 후 기존 TCP 소켓으로 송신
- TC 코드 정의
- `ground_station/uplink/tc_types.py`
- RESET, CHANGE MODE, SEND HELLO, SET RTC, CLEAR SD, CUT OFF
- 저장/기록
- `ground_station/storage/logger.py`
- 정상 패킷/손상 패킷 로그 저장
## B. MCU (ESP32 + Ethernet)
- 시스템 시작/태스크 구성
- `MCU/ethernet_test/main/main.c`
- `ethernet_setup()` + `tcp_server_task` + `uart_task` 초기화
- W5500 Ethernet 초기화 및 TCP 서버
- `MCU/ethernet_test/components/ethernet/ethernet.c`
- W5500 SPI 설정, netif attach, IP 이벤트, TCP accept/recv/send
- UART 브리지
- `MCU/ethernet_test/components/uart/uart.c`
- FPGA UART 수신, ID별 길이 처리, 패킷 버퍼 큐 전달
- 패킷 포맷/CRC/ACK
- `MCU/ethernet_test/components/format/format.c`
- `pack_tm`, `unpack_tc`, `format_ack`, CRC 검증
- 테스트 패킷 생성(개발용)
- `MCU/ethernet_test/components/packet_generation/packet_generation.c`
- 텔레메트리 패킷 생성
- `FPGA/Code/Packet_gen.vhd`
- TM 바이트 스트리밍(UART TX 연동)
- `FPGA/Code/TM_packet_sender.vhd`
- 모드 제어(파워세이브/파워온/컷오프)
- `FPGA/Code/Mode_control.vhd`
- 기타 센서/포맷/분배 블록
- `FPGA/Code/HK_formatter.vhd`
- `FPGA/Code/BITFLIP_formatter.vhd`
- `FPGA/Code/RAD_formatter.vhd`
- `FPGA/Code/TC_Distributor.vhd`
- `FPGA/Code/I2C_*.vhd`, `GNSS_*.vhd` 등
Ground Station 파서 기준 주요 타입:
- HK: 하우스키핑(시퀀스, RTC, GNSS, 온도, 고도 등)
- BF: 비트플립 정보(에러 주소/데이터/SRAM 인덱스 등)
- RAD: 대용량 방사선 데이터
- ACK: 텔레커맨드 응답
공통적으로 CRC 기반 무결성 검증을 수행하며, 실패 시 corrupt 로그로 분리 기록합니다.
## 8) 발표용 포인트 (WIZnet 사례 강조)
1. **왜 WIZnet인가**
- ESP32에서 SPI 기반으로 Ethernet(TCP/IP) 연결을 안정적으로 제공
- UART 전용 링크보다 지상국과의 네트워크 통합/운영이 용이
2. **프로젝트에서 실제로 어떻게 쓰였나**
- `init_wiz550io_eth()`에서 W5500 MAC/PHY를 생성
- `ethernet_setup()`에서 netif attach 및 IP/링크 이벤트 구성
- `tcp_server_task`에서 수신(TC) + 송신(TM) 동시 처리
3. **시스템 기여**
- FPGA 실험 데이터의 지상 전송 경로를 표준 TCP로 구성
- Ground Station GUI와 실시간 양방향 제어(Downlink + Uplink) 달성
1. MCU 부팅 후 Ethernet(W5500) 초기화
2. TCP 서버 태스크 시작
3. UART 태스크 시작, FPGA 데이터 수신
4. MCU가 패킷을 재포맷하여 TCP로 지상국 송신
5. Ground Station이 파싱/시각화/저장
6. Ground Station 명령을 TCP로 MCU에 전송
7. MCU가 FPGA로 TC 전달 + ACK 생성/반송
- 루트 소개: `README.md`
- Ground Station 소개: `ground_station/README.md`
- FPGA 개요: `FPGA/README.md`
이 문서는 위 코드 기준으로, **WIZnet(W5500) 사용이 포함된 실제 구현 경로**를 중심으로 정리한 프로젝트 설명서입니다.