243 lines
7.0 KiB
Markdown
243 lines
7.0 KiB
Markdown
# 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)
|