9.1 KiB
Certamente! È un'ottima idea avere un piano di sviluppo aggiornato e chiaro per tenere traccia dei progressi e dei passi successivi.
Ecco una versione rivista e dettagliata del piano di sviluppo, che include quanto fatto finora e i prossimi passi che abbiamo discusso. Ho cercato di mantenere la struttura a fasi, ma ho integrato le nuove comprensioni e priorità.
Piano di Sviluppo: FlightMonitor Application
🎯 Obiettivo Principale dell'Applicazione: Monitorare il traffico aereo in tempo reale (live) e analizzare voli passati (storico) tramite una GUI Tkinter, con visualizzazione testuale e grafica (mappa/lista).
🧱 Architettura Proposta (Modulare):
- GUI (Tkinter):
MainWindow, Viste specifiche (Live, Storico), Widget riutilizzabili. - Controller: Gestione eventi GUI, coordinamento moduli, logica applicativa principale.
- Data Layer:
- Adapters: Moduli specifici per provider (es.
OpenSkyLiveAdapter) che recuperano dati grezzi e li trasformano in... - Common Models: Modelli dati canonici (
CanonicalFlightState) usati internamente dall'applicazione. - Storage: Gestione della persistenza dei dati (es.
DataStorageper file SQLite giornalieri). - Configuration: Gestione delle impostazioni globali (
config.py).
- Adapters: Moduli specifici per provider (es.
- Utils: Moduli di utilità (es.
logger.py). - Business Logic (Futuro): Filtri avanzati, analisi, allerte (potrebbero risiedere nel controller o in un modulo
logic/separato).
📋 Fasi di Sviluppo e Priorità:
✔️ Fase 0 – Fondamenta e Setup Iniziale (Completata)
- Struttura base del progetto (cartelle
gui,controller,data,utils). - Entry point
__main__.py. - Modulo di configurazione base (
data/config.py). - Modulo di logging robusto e configurabile (
utils/logger.py) con output su console e GUI.
✔️ Fase 1 – GUI Minimale e Interazione Base (Completata)
MainWindow(gui/main_window.py) con layout di base:- Controlli (selezione modalità Live/Storico, pulsanti Start/Stop).
- Input per Bounding Box (lat/lon min/max).
- Area di output iniziale (Canvas per la mappa).
- Area per i log testuali (
ScrolledText). - Status Bar con semaforo visivo e messaggi di testo.
AppController(controller/app_controller.py) per:- Gestire gli eventi base della GUI (cambio modalità, start/stop).
- Coordinare l'interazione tra GUI e logica dati (inizialmente placeholder).
✔️ Fase 2 – Modalità Live: Fetching Asincrono e Visualizzazione Base (Completata)
- Definizione Modelli Dati Canonici (
data/common_models.py->CanonicalFlightState). OpenSkyLiveAdapter(data/opensky_live_adapter.py):- Esecuzione in un thread separato (
threading.Thread). - Polling periodico dell'API OpenSky (
/states/all) per un bounding box. - Parsing della risposta JSON e trasformazione dei dati grezzi in oggetti
CanonicalFlightState. - Gestione robusta degli errori API (incluso HTTP 429 Rate Limit) con strategia di backoff esponenziale.
- Comunicazione asincrona con
AppControllertramitequeue.Queue. - Invio di messaggi strutturati (dati di volo o messaggi di stato/errore) sulla coda.
- Esecuzione in un thread separato (
AppControlleraggiornato per:- Gestire il ciclo di vita dell'
OpenSkyLiveAdapter(avvio/arresto). - Consumare messaggi (dati e stati) dalla coda dell'adapter.
- Interpretare i messaggi di stato dell'adapter e aggiornare la GUI.
- Gestire il ciclo di vita dell'
MainWindowaggiornata per:- Visualizzare i voli (
List[CanonicalFlightState]) sultk.Canvas(punti e etichette base). - Utilizzare il metodo
update_semaphore_and_statusper riflettere lo stato comunicato dall'AppController.
- Visualizzare i voli (
✔️ Fase 3 – Persistenza Dati Live (Completata)
DataStorage(data/storage.py):- Logica per creare e gestire file SQLite giornalieri (basati su data UTC).
- Creazione automatica della directory dei database e delle tabelle (
flights,positions) se non esistono. - Schema DB definito per memorizzare dati da
CanonicalFlightState(inclusi timestamp, altitudini, velocità, ecc., e campi aggiuntivi comesquawk,spi,raw_data_provider). - Metodi
add_or_update_flight_dailyeadd_position_dailyche accettano/usanoCanonicalFlightState.
- Integrazione in
AppController:- Quando si ricevono
CanonicalFlightStatedall'adapter, vengono passati aDataStorageper il salvataggio nel DB giornaliero appropriato. - Gestione dell'inizializzazione e chiusura della connessione a
DataStorage.
- Quando si ricevono
📍 Punto Attuale (Dopo Fase 3):
- L'applicazione può recuperare dati live da OpenSky per un'area definita.
- I dati vengono aggiornati periodicamente senza bloccare la GUI.
- Gli errori API (come rate limit) sono gestiti con backoff.
- Lo stato dell'applicazione e del fetching è comunicato all'utente tramite una status bar con semaforo e messaggi.
- I dati live recuperati vengono salvati in file SQLite giornalieri.
- La struttura del codice è modulare e utilizza modelli dati canonici, preparandoci per future estensioni.
➡️ Fase 4 – Modalità Storico: Visualizzazione e Filtri Base (Prossima Priorità Alta)
- Caricamento Dati Storici:
- Implementare la logica in
DataStorageper interrogare i file SQLite giornalieri.- Metodo per ottenere voli e/o posizioni per un dato intervallo di tempo (che potrebbe coinvolgere l'apertura di più file giornalieri).
- Metodo per cercare voli per
icao24ocallsignin un range di date.
- Implementare la logica in
- GUI per la Modalità Storico (
gui/history_view.pyo integrazione inMainWindow):- Input per selezionare l'intervallo di date/ore.
- Input per filtri base (es. ICAO24, callsign, forse aeroporto se avessimo quei dati).
- Pulsante per caricare/visualizzare i dati storici.
- Visualizzazione Dati Storici:
- Tabella (
ttk.Treeviewo un widgetFlightTablepersonalizzato) per mostrare la lista dei voli e/o le loro posizioni. - Opzionale: Visualizzazione statica della traccia di un volo selezionato sul
tk.Canvas.
- Tabella (
AppController:- Logica per
start_history_monitoringestop_history_monitoring. - Interazione con
DataStorageper recuperare i dati. - Passaggio dei dati storici alla GUI per la visualizzazione.
- Logica per
➡️ Fase 5 – Funzionalità Avanzate e Miglioramenti
- Miglioramenti Mappa (Media Priorità):
- Valutare l'integrazione di una libreria di mappe più avanzata (es.
tkintermapviewofoliumse si considera un output web/HTML separato, anche setkintermapviewè più integrato). - Disegnare icone di aerei più realistiche (magari orientate in base al
true_track). - Possibilità di cliccare su un aereo per vedere più dettagli.
- Visualizzazione delle tracce dei voli (dallo storico o segmenti live).
- Valutare l'integrazione di una libreria di mappe più avanzata (es.
- Analisi Semplice (Business Logic - Media Priorità):
- Creare un modulo
logic/analytics.py. - Funzioni per calcolare statistiche base dai dati storici (es. numero di voli per ora/giorno, rotte più frequenti in un'area, altitudini medie).
- Visualizzazione di queste analisi nella GUI.
- Creare un modulo
- Filtri Avanzati (Media Priorità):
- Creare
logic/filters.py. - Filtri dinamici applicabili sia ai dati live che storici (tipo di aereo, compagnia – richiederebbe dati aggiuntivi – altitudine, velocità).
- Creare
- Recupero Dati Storici da API Esterne (Bassa/Media Priorità, come discusso):
- Implementare la logica (magari in un
OpenSkyHistoryAdapter) per scaricare dati storici da OpenSky (o altri provider) se mancano nei nostri DB giornalieri. - Questo si integrerebbe con la Fase 4, quando si cercano dati storici.
- Implementare la logica (magari in un
- Configurazioni Utente (Bassa/Media Priorità):
- Salvataggio/caricamento delle preferenze utente (es. ultimo bounding box usato, tema GUI, API keys se necessarie).
- Finestra di dialogo per le impostazioni.
- Esportazione Dati (Bassa Priorità):
- Funzionalità per esportare i dati selezionati (live o storici) in formati come CSV o JSON.
➡️ Fase 6 – Pulizia, Test, Documentazione e Rilascio (Continua)
- Test Unitari: Scrivere unit test per i componenti core (modelli, adapter, storage, logica di business).
- Test di Integrazione: Testare il flusso completo dell'applicazione.
- Refactoring e Pulizia Codice: Continuare a migliorare la qualità del codice.
- Documentazione:
- Migliorare docstring e commenti.
- Scrivere/aggiornare
README.mdcon istruzioni d'uso, setup, dipendenze.
- Gestione Dipendenze: (es.
requirements.txt). - Packaging (Opzionale): Creare un eseguibile distribuibile (es. con PyInstaller).
Questo piano è una guida; le priorità possono cambiare e nuove idee possono emergere. Spero che questa visione d'insieme ti sia utile! Abbiamo fatto ottimi progressi sulle fondamenta e sulla modalità live. La Fase 4 sulla modalità storico sarà il prossimo grande blocco di funzionalità.