# 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)