# Kartlar ve firmware

Sistem her kartta aynı sistemdir. Farklar koda gömülü değil, veridir: her kartın `boards/<ad>/cyd.py` dosyası bir `OZELLIKLER` sözlüğü bildirir, `runtime.ozellikler()` bunu ölçülen çekirdek yetenekleriyle (`threads`, `max_jobs`, `platform`) birleştirir, `GET /api/caps` yayınlar ve **panel desteklenmeyen düğmeleri gizler**.

```python
OZELLIKLER = {
    'display': True, 'touch': True, 'sd': True, 'rgb_led': True,
    'light': True, 'speaker': True, 'ble': True, 'tls': True,
    'wifi_config': True, 'docs': True, 'lite_ui': False,
}
```

| Özellik | CYD | OLED | NodeMCU |
|---|---|---|---|
| display / touch / sd | ✅ ✅ ✅ | ✅ ❌ ❌ | ❌ ❌ ❌ |
| rgb_led / light / speaker | ✅ ✅ ✅ | ❌ ❌ ❌ | ✅ ✅ ❌ |
| ble / tls (solo modda) | ✅ ✅ | ✅ ✅ | ❌ ❌ |
| wifi_config / docs | ✅ ✅ | ✅ ✅ | ❌ ❌ |
| lite_ui | ❌ | ❌ | ✅ |
| threads / max_jobs | ✅ 8 (thread 4) | ✅ 4 | ❌ 3 |

## CYD (ESP32-2432S028R)

"Cheap Yellow Display": 320×240 ILI9341 ekran, XPT2046 dokunmatik, SD yuvası, RGB LED, LDR, hoparlör, CH340 USB-seri. **Özel firmware** (`micropython-esp32-cydstudio.bin`, v1.28.0 tabanlı `CYD_STUDIO` kartı):

- 12 çekirdek modülü flash'a dondurulmuş: `runtime jobs sysinfo logstore settings netmgr store server` + `cyd ili9341 xpt2046 sdcard`. `boot.py`, `main.py`, `index.html`, belgeler dosya sisteminde kalır.
- **Sabit heap** 96 KB, otomatik büyüme kapalı.
- RAM diyeti (`sdkconfig.free_ram`): TCP pencere 5760 → 3072, WiFi tamponları 10/32/32 → 8/12/12, soket 16 → 6.
- Sonuç: boşta dahili DRAM 55 KB (stokta 27,8), 7 normal + 2–3 thread proje.

Ekran doğal olarak yataydır ve RGB düzenindedir: doğrulanmış ayar `rotation=0`, `bgr=False`, 320×240. Panel MISO bağlı olmadığı için geri okunamaz, yön gözle ayarlanır (Ayarlar → Ekran ayarı, canlı). SD yalnız VSPI'de (slot 3); slot 2 ekranın hattıdır.

Yeniden derleme (WSL, ESP-IDF v5.5.1): `python tools/frozen_esp32_build.py [--heap 96]`, ~3 dakika. Flash: `tools/flash.py COM3 firmware/micropython-esp32-cydstudio.bin --koru` (BOOT basılı yordamı). Deploy: `tools/deploy.py --board cyd --frozen --samples --reset`.

## NodeMCU (ESP8266)

Dahili LED, tek analog giriş (`cyd.A0`), 38 KB heap, `_thread` yok. **Özel firmware** (`micropython-esp8266-frozen.bin`): çekirdek + sade sunucu (`boards/nodemcu/server.py`) + `ssd1306` dondurulmuş, asyncio dahil.

| | Stok | Frozen |
|---|---|---|
| Panel modu, taze açılış | 4 784 B | **24 704 B** |
| ~5 dakika sonra | 2 512 B | **24 672 B** (parçalanma yok) |

Stokta 3 KB'lik bir proje bile `compile()` satırında `MemoryError` veriyordu; dondurmak bytecode'u flash'ta tutar. Pin etiketleri `cyd.D0`…`cyd.D8`: `D1`/`D2` (GPIO5/4) rahat giriş/çıkış ve I2C çifti, `D4` (GPIO2) kart üstü mavi LED (ters mantık), `D3`/`D8`/`D0` açılışta özel görevli, kaçın.

Sade panel (`boards/nodemcu/index.html`, ~31 KB): arama, satır başına ▶/■/✕, Konsol | Kayıtlı log, Ayarlar, Doküman, TR/EN, kısayollar. Derleme: `tools/frozen_esp8266_build.py`; flash `tools/flash_esp8266.py COM3 --koru` (tuş yok); deploy `tools/deploy_mpy.py --board nodemcu --frozen --samples --reset`.

## ESP32 OLED

128×64 SSD1306 OLED, dokunmatik ve SD yok, CP2102 USB-seri. Stok MicroPython v1.28; çekirdek dosya sistemine gider (`deploy.py --board oled --samples`). `Ekran` sınıfı ILI9341 ile aynı API'yi sunar, renkler yanık/sönük'e düşer; CYD projeleri değişmeden çalışır. I2C pinleri modele göre değişir, `_oled_bul()` aday çiftleri `(5,4) (4,15) (21,22) (16,17) (13,14)` sırayla dener. `cyd.touch()`, `cyd.light()`, `cyd.beep()` açık hata fırlatır.

> **Dikkat:** Bu kart PC'nin USB portundan beslenince WiFi açıldığı anda 3,3 V hattı çöker (brownout döngüsü). Yazılımla çözülmez; çıplak MicroPython'da `wlan.active(True)` satırında aynı çöküş olur. Çözüm: pil konnektörüne LiPo, beslemeli hub ya da harici sabit 3,3 V. Harici 3,3 V ile 240 MHz ve tam verici gücünde sorunsuz çalıştı.

## Yeni kart eklemek

`boards/<ad>/` altına `cyd.py` (bir `OZELLIKLER` sözlüğü + `runtime`'dan `should_stop`, `sleep`, `rota`, `dram`, `wifi`, `buton` dışa aktarımı) ve `config.example.json` koy; gerekiyorsa sürücüler. Çekirdek dosyalarına dokunmak gerekmez. Yeni bir özellik eklerken: `runtime._VARSAYILAN`'a anahtarı ekle, ilgili kartların `OZELLIKLER`'inde aç, panelde `caps.<anahtar>` ile kontrol et.

## Gölgeleme

`sys.path = ['', '.frozen', '/lib', '/projects']`: dosya sistemindeki aynı adlı `.py` dondurulmuşu ezer. Tek dosyayı hızlı denemek için `mpremote fs cp x.py :x.py` olur, ama her gölge heap'ten ~10 KB yer ve ölçümler o durumda yanıltır. Çekirdek değişince firmware yeniden derlenmeli; sonunda `--frozen` ile temizle.
