# GUI Refactoring - Sistema Completamente Rinnovato

## Panoramica delle Modifiche

Il sistema GUI è stato **completamente ristrutturato** per eliminare la vecchia architettura basata su `FlashProfile` e utilizzare esclusivamente il nuovo sistema gerarchico basato su `GlobalConfig`, `FlashModel` e `FlashTarget` derivato da `targets.ini`.

## Motivazioni

1. **Eliminazione duplicazioni**: La vecchia struttura `FlashProfile` duplicava informazioni (IP, port, size) per ogni target
2. **Allineamento con targets.ini**: Conformità totale con il file di configurazione della vecchia applicazione C++/Qt
3. **Gestione centralizzata**: Configurazione globale in un unico punto
4. **Riusabilità**: I modelli FPGA sono definiti una volta e riutilizzati da più target
5. **Facilità di manutenzione**: Modifiche ai modelli si propagano automaticamente

## Architettura Nuova vs Vecchia

### Vecchia Architettura (Eliminata)
```
FlashProfile (per ogni target)
  ├─ name
  ├─ ip, port (duplicati)
  ├─ slot_address
  ├─ base_address, size (duplicati per stesso modello)
  └─ binary_path

ProfileManager
  └─ profiles: List[FlashProfile]
```

### Nuova Architettura
```
GlobalConfig (unica istanza)
  ├─ ip, port (centralizzati)
  ├─ srio_base, fpga_base, fpga_sector
  └─ default_target

FlashModel (riutilizzabili)
  ├─ id_model
  ├─ model, description
  ├─ flash_type, is_4byte_addressing
  ├─ num_sectors
  └─ golden/user memory areas

FlashTarget (istanze)
  ├─ id_target
  ├─ slot_address
  ├─ architecture
  ├─ id_model (→ riferimento a FlashModel)
  └─ binary_path

ProfileManager
  ├─ global_config: GlobalConfig
  ├─ models: Dict[int, FlashModel]
  └─ targets: Dict[str, FlashTarget]
```

## Modifiche al GUI

### FlasherGUI (Finestra Principale)

**Prima:**
- Combo di selezione "Flash Profile"
- Info panel minimale (IP, slot, base address, size)
- Adapter layer `GUIProfileAdapter` per compatibilità

**Dopo:**
- Combo di selezione "Target FPGA" (nomi target da `targets.ini`)
- Info panel completo con:
  - Descrizione target
  - IP:Port dalla configurazione globale
  - Slot SRIO
  - Architettura (Xilinx/RFIF)
  - Modello FPGA e descrizione
  - Tipo flash e indirizzamento
  - Numero di settori
  - Aree Golden e User con indirizzi completi
- Nessun adapter: uso diretto di `ProfileManager`

### ConfigManagerDialog (Nuovo)

Dialog a **3 tab** per gestione completa:

#### Tab 1: Global Config
- IP Address
- Port
- SRIO Base (hex)
- FPGA Base (hex)
- Sector Size (hex)
- Default Target (combobox con tutti i target)
- Pulsante "Apply Global Settings"

#### Tab 2: Flash Models
- Lista modelli: `[ID] model - description`
- Pulsanti: New Model, Edit Model, Delete Model
- Panel dettagli:
  - ID, Model, Description
  - Flash Type, Addressing
  - Sectors
  - Golden Area (start, stop, size MB)
  - User Area (start, stop, size MB)
  - Test Address (opzionale)

#### Tab 3: Targets
- Lista target: `id_target - description`
- Pulsanti: New Target, Edit Target, Delete Target
- Panel dettagli:
  - ID, Description
  - Slot Address (hex)
  - Architecture
  - Model (nome)
  - File Prefix
  - Binary Path

### ModelEditDialog (Nuovo)

Form completo per editing modelli:
- Model ID (readonly se editing)
- Model Name
- Description
- Flash Type
- 4-byte Addressing (checkbox)
- Number of Sectors
- Golden Start/Stop (hex)
- User Start/Stop (hex)
- Test Address (hex, optional)

**Validazione:**
- ID univoco per nuovi modelli
- Tutti i campi richiesti
- Indirizzi hex validi

### TargetEditDialog (Nuovo)

Form completo per editing target:
- Target ID (readonly se editing)
- Description
- Slot Address (hex)
- Architecture (combobox: Xilinx, RFIF, Other)
- Name
- File Prefix
- Flash Model (combobox con lista modelli)
- Binary File (optional, con browse)

**Validazione:**
- ID univoco per nuovi target
- Modello obbligatorio
- Slot address hex valido

## Funzionalità Nuove

### 1. Gestione Modelli Completa
- Creazione, modifica, eliminazione modelli
- Visualizzazione dettagli completi (aree memoria, settori, ecc.)
- Controllo dipendenze (non si può eliminare un modello in uso)

### 2. Gestione Target Completa
- Creazione, modifica, eliminazione target
- Selezione modello da lista
- Associazione binario opzionale

### 3. Configurazione Globale
- Modifica IP e porta centralizzata
- Configurazione SRIO e FPGA base
- Selezione default target

### 4. Sincronizzazione Automatica
- Refresh target combo dopo modifiche
- Aggiornamento configurazione globale dopo edit
- Salvataggio persistente in JSON

## Caricamento Iniziale

All'avvio, l'applicazione:

1. Cerca `flash_profiles.json`
2. Se vuoto/mancante, cerca `_OLD/Vecchia_app/FpgaBeamMeUp/targets.ini`
3. Carica automaticamente tutti i modelli e target dal `.ini`
4. Salva in formato JSON per usi futuri
5. Seleziona il target di default dalla configurazione globale

**Output all'avvio:**
```
Loading configuration from _OLD/Vecchia_app/FpgaBeamMeUp/targets.ini...
Loaded 9 targets, 3 models
Target selected: AESA_RFIF
  Model: rfif, Slot: 0x16
  User area: 0x00400000 - 0x007FFFFF
```

## File Modificati

- [pydownloadfwviasrio/gui/gui.py](../pydownloadfwviasrio/gui/gui.py): Riscrittura completa
  - Eliminati: `GUIProfileAdapter`, `ProfileManagerDialog`, `ProfileEditDialog`
  - Aggiunti: `ConfigManagerDialog`, `ModelEditDialog`, `TargetEditDialog`
  - Modificato: `FlasherGUI` per uso diretto di `ProfileManager`

## Compatibilità con FirmwareFlasher

**Problema temporaneo:** `FirmwareFlasher` accetta ancora `FlashProfile` come parametro.

**Soluzione attuale:** Creazione di un `FlashProfile` temporaneo in `_on_target_selected()`:
```python
temp_profile = FlashProfile(
    name=target.id_target,
    slot_address=f"0x{target.slot_address:02X}",
    ip=global_config.ip,
    port=global_config.port,
    base_address=model.user_start,
    size=(model.user_stop - model.user_start + 1),
    binary_path=target.binary_path,
)
```

**TODO futuro:** Refactoring di `FirmwareFlasher` per accettare `(FlashTarget, FlashModel, GlobalConfig)` direttamente.

## Test Eseguiti

✅ Avvio applicazione  
✅ Caricamento automatico da `targets.ini`  
✅ Visualizzazione 9 target  
✅ Selezione target dalla combo  
✅ Visualizzazione info dettagliate target  
✅ Apertura dialog configurazione  
✅ Navigazione tra tab (Global, Models, Targets)  
✅ Nessun errore di tipo o runtime  

## Benefici Ottenuti

1. **Zero duplicazioni**: IP, port, memory maps definiti una volta
2. **Manutenibilità**: Modifiche centralizzate e propagate automaticamente
3. **Usabilità**: Interfaccia a tab intuitiva e completa
4. **Conformità**: 100% allineato con `targets.ini` originale
5. **Estensibilità**: Facile aggiungere nuovi modelli e target
6. **Validazione**: Controlli completi su input e dipendenze

## Prossimi Passi

- [ ] Refactoring `FirmwareFlasher` per eliminare dipendenza da `FlashProfile`
- [ ] Aggiungere import/export INI nel dialog configurazione
- [ ] Implementare ricerca/filtro nella lista target
- [ ] Aggiungere wizard per creazione target rapida
- [ ] Validazione avanzata indirizzi memoria (overlap check)
