# Components Übersicht

Dieses Dokument beschreibt alle Components im ESP32-S3 GameBoy Projekt.

## 🎮 Aktiv genutzte Components

### 1. **peanut-gb** (GameBoy Emulator Core)
- **Pfad:** `components/peanut-gb/`
- **Typ:** Header-Only Emulator
- **Funktion:** Vollständiger GameBoy (DMG) Emulator
- **Optimierung:** Kompiliert mit `-O3` Flag für maximale Performance
- **Features:**
  - CPU Emulation (Z80-ähnlicher Sharp LR35902)
  - PPU (Picture Processing Unit) für Grafik
  - APU (Audio Processing Unit) mit 4 Kanälen
  - Memory Management & Cartridge Support

**Verwendung in main.c:**
```c
#include "peanut_gb.h"
gb_init(&gb, &gb_rom_read, ...);  // Emulator initialisieren
gb_run_frame(&gb);                 // Ein Frame emulieren
```

### 2. **st7789** (Display-Treiber)
- **Pfad:** `components/st7789/`
- **Typ:** SPI Display-Treiber
- **Hardware:** ST7789V2 Controller (320×240, 2.0" TFT)
- **SPI-Frequenz:** 80 MHz
- **Features:**
  - Hardware-Reset über GPIO
  - PWM-Hintergrundbeleuchtung (0-100%)
  - DMA-basierte SPI-Transfers
  - Optimierte `preswapped` Funktion (BGR565)

**API-Funktionen:**
```c
st7789_init();                              // Display initialisieren
st7789_set_backlight(80);                   // Helligkeit 80%
st7789_fill_screen(0xF800);                 // Rot
st7789_draw_buffer_preswapped(buffer, ...); // Framebuffer (SCHNELL!)
```

**Performance-Trick:**
Die `preswapped` Funktion spart ~33% CPU-Zeit, da kein Byte-Swapping nötig ist:
```c
// RGB565 → BGR565 Swap direkt beim Rendering
uint16_t c = gb_palette[pixel];
uint16_t swapped = (c >> 8) | (c << 8);  // Einmal swappen
buffer[i] = swapped;  // → st7789_draw_buffer_preswapped()
```

### 3. **minizip** & **zlib** (Kompression)
- **Pfad:** `components/minizip/`, `components/zlib/`
- **Funktion:** ZIP-Datei Unterstützung
- **Status:** Vorbereitet für zukünftige ROM-Kompression
- **Verwendung:** ROMs können als `.zip` geladen werden

---

## 🔮 Für zukünftige Features vorbereitet

### 4. **link_cable** (2-Player Link-Kabel)
- **Pfad:** `components/link_cable/`
- **Funktion:** GameBoy Link-Kabel Emulation über GPIO
- **Pins:** GPIO 15 (SCLK), GPIO 2 (SOUT), GPIO 17 (SIN)
- **Status:** Component vorhanden, noch nicht integriert
- **Zukünftige Nutzung:**
  - 2-Player Modi (z.B. Tetris vs., Pokémon Tausch)
  - Kommunikation via GPIO oder ESP-NOW

**Hardware-Vorbereitung:**
```c
#define LINK_GPIO_SCLK     15
#define LINK_GPIO_SOUT     2
#define LINK_GPIO_SIN      17
#define LINK_CLOCK_FREQ    8192  // GameBoy Link Cable: 8192 Hz
```

### 5. **nfc_manager** (NFC-Reader PN532)
- **Pfad:** `components/nfc_manager/`
- **Hardware:** PN532 NFC-Reader
- **Interface:** I2C (geteilt mit Touch-Controller)
- **I2C-Adresse:** 0x24 (Touch: 0x15)
- **Pins:** GPIO 5 (SDA), GPIO 6 (SCL) - SHARED BUS!
- **Status:** Component vorhanden, noch nicht integriert
- **Zukünftige Nutzung:**
  - ROM-Auswahl via NFC-Tag
  - Save-State auf NFC-Tag speichern
  - Cheat-Codes via NFC

**I2C-Bus-Sharing:**
```c
// Touch Controller: 0x15 @ 400 kHz
// NFC Reader:       0x24 @ 100 kHz
// Beide auf I2C_NUM_0, GPIO 5/6
```

### 6. **potentiometer_manager** (ADC für Potis)
- **Pfad:** `components/potentiometer_manager/`
- **Hardware:** 2× Potentiometer
- **Pins:**
  - GPIO 3 (ADC1_CH2): Volume
  - GPIO 4 (ADC1_CH3): Brightness
- **ADC:** 12-bit (0-4095)
- **Status:** Component vorhanden, noch nicht integriert
- **Zukünftige Nutzung:**
  - Volume-Kontrolle für Audio (0-100%)
  - Brightness-Kontrolle für Display (0-100%)

**Geplante Integration:**
```c
// Im audio_task:
int volume = poti_read_volume();  // 0-100
master_vol_left = volume * 7 / 100;  // NR50 Master Volume

// Im display_task:
int brightness = poti_read_brightness();  // 0-100
st7789_set_backlight(brightness);
```

---

## 🗑️ Nicht genutzte Components

Diese Components stammen vom ursprünglichen MCH2022-Badge Projekt und werden **NICHT** verwendet:

- **appfs** - App-Dateisystem (MCH2022 spezifisch)
- **bus-i2c** - I2C-Bus-Manager (direkte Treiber verwenden)
- **i2c-bme680** - BME680 Umweltsensor
- **i2c-bno055** - BNO055 IMU-Sensor
- **mch2022-bsp** - MCH2022 Board Support Package
- **mch2022-rp2040** - RP2040 Co-Prozessor
- **pax-codecs** - PAX Graphics Codecs
- **pax-graphics** - PAX Graphics Library
- **pax-keyboard** - PAX Keyboard
- **sdcard** - Alte SD-Karten Component (nutzen VFS direkt)
- **spi-ice40** - ICE40 FPGA
- **spi-ili9341** - ILI9341 Display (haben ST7789)
- **ws2812** - WS2812 RGB-LEDs

Diese Components können gelöscht werden, falls Speicherplatz benötigt wird.

---

## 📊 Component Abhängigkeiten

```
main
 ├─► peanut-gb (Emulator)
 ├─► st7789 (Display)
 ├─► minizip (ROM-Kompression, optional)
 └─► zlib (Kompression-Backend)

Zukünftig:
 ├─► link_cable (2-Player)
 ├─► nfc_manager (NFC-Tags)
 └─► potentiometer_manager (Volume/Brightness)
```

---

## 🔧 Neue Component hinzufügen

1. Component-Ordner in `components/` erstellen
2. `CMakeLists.txt` erstellen:
   ```cmake
   idf_component_register(
       SRCS "meine_component.c"
       INCLUDE_DIRS "include"
       REQUIRES "esp_timer"
   )
   ```
3. In `main/CMakeLists.txt` als Abhängigkeit hinzufügen:
   ```cmake
   idf_component_register(
       SRCS "main.c"
       INCLUDE_DIRS "include"
       REQUIRES "st7789" "peanut-gb" "meine_component"
   )
   ```
4. In `main.c` einbinden:
   ```c
   #include "meine_component.h"
   ```

---

## 📝 Hinweise

- Alle Components werden mit dem ESP-IDF Build-System kompiliert
- Components können Optimierungs-Flags in ihrer `CMakeLists.txt` setzen
- Performance-kritische Components sollten `-O3` verwenden
- DMA-Buffer müssen mit `MALLOC_CAP_DMA` allokiert werden
- PSRAM-Buffer sollten `MALLOC_CAP_SPIRAM` verwenden
