# Firmware OTA

Carpeta de binarios compilados. Cuando el coche arranca, cada placa
consulta su `version.txt`, lo compara con la versión en el código,
y descarga `firmware.bin` si hay novedad.

## Estructura

```
firmware/
├── esp32cam/
│   ├── version.txt   ← número entero (1, 2, 3…)
│   └── firmware.bin  ← binario compilado
└── esp8266/
    ├── version.txt
    └── firmware.bin
```

## Publicar nueva versión

### 1 · Compilar el binario

En Arduino IDE:  
**Sketch → Exportar binario compilado** (o `Ctrl+Alt+S`)

El `.bin` aparece en la carpeta del sketch:
- `Esp32Cam/Esp32Cam.ino.bin`
- `ESP8266/ESP8266.ino.bin`

### 2 · Copiar al repo

```bash
# ESP32-CAM
cp Esp32Cam/Esp32Cam.ino.bin firmware/esp32cam/firmware.bin

# ESP8266 / Wemos D1
cp ESP8266/ESP8266.ino.bin firmware/esp8266/firmware.bin
```

### 3 · Incrementar version.txt

Edita el archivo de la placa que has cambiado.  
El número debe ser **mayor** que el anterior — solo el entero:

```
2
```

### 4 · Subir al repo

```bash
git add firmware/
git commit -m "firmware: v2 — descripción del cambio"
git push
```

Las placas actualizarán en el próximo arranque automáticamente.

---

## Primera vez (configuración inicial)

### Config en el código

Antes de flashear por primera vez, edita en cada `.ino`:

| Variable       | Dónde            | Valor                          |
|----------------|------------------|--------------------------------|
| `GITEA_HOST`   | Ambos `.ino`     | `http://IP-DE-TU-GITEA:3000`  |
| `GITEA_OWNER`  | Ambos `.ino`     | Tu usuario Gitea               |
| `GITEA_REPO`   | Ambos `.ino`     | Nombre del repositorio         |
| `WIFI_SSID`    | `ESP8266.ino`    | Nombre de tu WiFi              |
| `WIFI_PASS`    | `ESP8266.ino`    | Contraseña WiFi                |

### Partición ESP32-CAM (importante)

El OTA necesita **dos particiones de app**. El `partitions.csv` ya
está actualizado, pero la primera vez hay que flashear por USB para
que el IDE grabe la nueva tabla de particiones.

A partir de ese flash inicial, las actualizaciones son 100% OTA.

### Subir el primer firmware.bin

Compila cada sketch, copia los `.bin` a sus carpetas y haz push.
La `version.txt` inicial vale `1` (ya está puesta).

---

## Repo privado en Gitea

Si el repo es privado, añade tu token al HOST en el código:

```cpp
#define GITEA_HOST "http://TOKEN@IP:3000"
```

O usa la URL completa con token en la query:

```cpp
String base = String("http://IP:3000/owner/repo/raw/branch/main/firmware/esp32cam/")
            + "?token=TU_TOKEN";
```
