Technology Experience
Flight Simulation

Il mio progetto per Piloti Virtuali Italiani: WPF, WCF, ASP.NET MVC, Google e WP7

Questo si preannuncia come un post piuttosto lungo, almeno credo.

Da qualche anno sono socio dei PVI (Piloti Virtuali Italiani). Spesso, quando parlo con altri soci (siamo diverse centinata, sparsi un po’ in tutta Italia) mi definisco la “parte informatica” di PVI. Proprio seguendo questo filone, ho contribuito in prima persona alla realizzazione di un sistema, che per gli standard PVI è piuttosto complesso.

E siccome, come potete ben immaginare, coinvolge soprattutto tecnologie Microsoft, questa sera ne voglio parlare qua sul mio blog.

Introduzione
Dunque, una premessa è d’obbligo. PVI è una community a pagamento che tratta di simulazione di volo. Questo significa che quasi tutti i soci hanno un PC a casa con installato Microsoft Flight Simulator X, più una miriade di add-on (scenari, aerei, utility) tutti inerenti il volo. I soci hanno accesso ad un server privato e dedicato che permette loro di volare in multiplayer.

Il problema che si voleva risolvere era di rendere evidente le attività di volo che ciascun socio fa per conto suo, sul suo PC, senza necessariamente collegarsi ad un server con altre persone. E’ così che il Natale scorso, in sordina, ho cominciato a farmi venire qualche idea per dare il mio contributo.

Guardate questo schema sempliciotto:

Qualche dettaglio in più
Ok, lo so, è un po’ infantile, ma mi sono divertito con la tavoletta grafica che giaceva abbandonata da un po’.
I rettangoli rappresentano le componenti principali, e cioè:

  • FSX : Flight Simulator X, il vero simulatore di volo, installato a casa dei soci PVI, prodotto da Microsoft
  • FSX Logger, software in WPF scritto da me che rappresenta una vera e propria scatola nera specifica per FSX. FSX è programmabile e gestibile da .NET grazie all’utilizzo della libreria SimConnect.dll, che viene automaticamente installata nel sistema quando si installa il simulatore
  • WCF Service, servizio WCF scritto da me che dialoga con FSX Logger, riceve ed invia informazioni (maggiori dettagli di seguito)
  • Roster PVI, sito Web scritto (da me!!!!!!) in ASP.NET MVC che permette di scaricare FSX Logger, di vedere tutti i voli completati, etc.

Quindi, la morale è: i soci utilizzano FSX per fare i loro voli, da Milano a Roma, dal Nord Africa all’Inghilterra, con piccoli Cessna al grande 747, con elicotteri da trasporto, oppure con vecchi biplani. Tali voli vengono registrati con FSX Logger. La registrazione di volo è contenuta in un file zip, che viene salvato all’interno della cartella Documenti del PC. Questo file zip contiene un po’ di cosucce interessanti:

  • il file kml del volo (file XML standard riconosciuto, tra le altre cose, da Google Maps e Google Earth, ma non solo)
  • eventuali fotografie scattate durante il volo (premendo il tasto ‘v’ mentre si vola con FSX si scatta uno screenshot della schermata – il mio software trova la foto e la include nello zip
  • file csv, che contiene DAVVERO UNA MIRIADE di informazioni, registrate ogni secondo di volo. Per maggiori informazioni, cliccate qui. L’elenco non è aggiornatissimo, altre variabili sono state aggiunte successivamente

Lo zip, come dicevo prima, viene automaticamente salvato sul proprio PC. FSX Logger, però, può inviarlo automaticamente per la pubblicazione sul sito Web, attraverso l’utilizzo di servizio WCF che espone un’interfaccia per mettere in atto determinate funzionalità. Uno di questi metodi riceve un semplice byte[], che lato server viene manipolato e pubblicato.

Preso un file zip, il file csv contenuto viene aperto e manipolato, dicevo, al fine di ottenere tutta una serie di informazioni, tra cui:

  1. Durata effettiva del volo
  2. Consumi di carburante
  3. Tipo di aeromobile utilizzato (tipo di motore, modello, etc. etc.)
  4. Andamento dell’altitudine, della velocità verticale, dell’heading e molto altro ancora
  5. Velocità al momento del decollo (rotation speed) e dell’atterraggio (touch-down speed)
  6. Varie condizioni di allarme: stallo, overspeed, angolo di virata troppo elevati, utilizzo del carrello errato, etc.
  7. Stato delle luci (beacon, landing, panel, strobe, e via dicendo)

Per ciascun volo, viene calcolato un punteggio. Nel momento in cui vi scrivo, tale punteggio viene calcolato basandosi esclusivamente sul tempo. Ogni 10 minuti di volo effettivo, il pilota guadagna 1 punto. Avevo inserito delle penalità, ma le ho rimosse perchè dopo averci ragionato su per parecchie settimane, non piacevano e non potevano essere del tutto corrette. Un volo può comunque essere invalidato e guadagnare 0 punti se:

  1. Il pilota ha messo in pausa in simulatore
  2. Il pilota ha rallentato/aumentato la velocità di simulazione
  3. Il pilota ha fatto carburante in volo (operazione che ovviamente in realtà sarebbe impossibile con i classici aerei)
  4. Il pilota non è nemmeno decollato nè atterrato (sembrerà strano, ma può succedere)
  5. Il pilota ha cambiato aeroplano in volo (nella realtà sarebbe impossibile, ma qui ovviamente sì…che simulatore sarebbe?)

Tutti i voli pubblicati finiscono quindi su quello che noi Piloti Virtuali chiamiamo Roster. Quello ufficiale di PVI lo trovate a questo indirizzo. Oltre al classico elenco di tutti i voli completati, sono disponibili altre viste:

  1. Classifica in base al tempo
  2. Classifica in base al punteggio

Girando sul sito è possibile ottenere altre viste più o meno dettagliate. C’è anche una vista dedicata alla visualizzazione delle fotografie scattate durante il volo: ovviamente quando FSX Logger invia il file zip sul server, tale file contiene anche i files jpg, e quindi realizzare tutto ciò non è un grosso problema.

Come dicevo prima, il sito Web è stato realizzato interamente da me con ASP.NET MVC. E mi sono trovato alla grande. Dietro le quinte, ovviamente, utilizzo SQL Server ed Entity Framework per la gestione delle entity e del piccolo dominio con cui ho a che fare.

Categoria del volo
Quando si avvia Fsx Logger, il pilota che si appresta ad iniziare un volo può specificare in quale categoria cade il volo stesso. VFR significa Visual Flight Rule, ed in pratica (molto in pratica) significa volo visuale. Si vola di giorno, orientadosi guardando il paesaggio sottostante: fiumi, laghi, tangenziale, paesi, tralicci della luce, mulini a vento, e tutto ciò che vi pyò aiutare a capire dove siete e in che direzione state andando. Un’altra categoria è IFR, che sta per Instrumental Flight Rule. Qui si vola con le classiche regole di radio-navigazione: NDF, VOR, radiali, SID e STAR, e via dicendo. Questa categoria è quella di tutti voli di linea, italiani ed esteri. Noi di Piloti Virtuali ci siamo “inventati” altre categorie, derivate da queste, e che si legano a particolari eventi che si sussegguono durante l’anno. Qualche esempio:

  • IVAO VFR
  • IVAO IFR
  • Crazy Horse
  • Purple Drake
  • Altre ancora

IVAO sta per International Virtual Aviation Organization. La faccio breve: è un’organizzazione internazionale di controllori di volo. Normalmente quando si vola con FSX sta a noi rispettare e simulare le vere regole di navigazione. Esempio: durante il rullaggio non si possono superare i 30 nodi, oppure sotto i 10.000 piedi di altitudine non si possono superare i 250 nodi. Oppure, in uscita da Linate devo seguire determinate rotte, e non andare dove mi pare e piace. Volare su IVAO significa collegarsi con un client, mettersi in comunicazione con i controllori di volo virtuali, che dirigono il traffico. Quando si vola su IVAO, è necessario impostare in Fsx Logger le categorie corrette.

Crazy Horse e Purple Drake sono invece due iniziative diverse: voli in multiplayer che si svolgono in determinate serate, con un particolare tema.

Ora, la cosa importante da dire è che quando si selezionano queste categorie la regola di calcolo del punteggio cambia. Mentre normalmente si guadagna 1 punto ogni 10 minuti di volo, se si vola durante il Purple Drake i punti guadagnati sono 1,5 ogni 10 minuti, e così via. Si è reso necessario quindi fare in modo che queste categorie di volo siano effettivamente disponibili in Fsx Logger solo quando quel determinato volo esiste. Altrimenti è come dire che io ho partecipato alla 5° Tappa del Giro d’Italia oggi, 1° Ottobre 2011, quando in realtà il Giro d’Italia non c’è.

Per risolvere questo problema, ho inizialmente sviluppato questa cosa sfruttando il mio database che fa girare tutto il sistema. Nella tabella che contiene tutte le categorie di volo mi sono inventato due campi: StartDate ed EndDate, facendo in modo quindi che Fsx Logger all’avvio scarichi solo le categorie effettivamente disponibili in quel momento. Però la cosa è diventata complicata da gestire, soprattutto in presenza di eventi schedulati nel tempo, perchè ogni settimana dovevo ricordarmi di spostare in avanti la data.

E’ qui che ho cominciato ad utilizzare Google Calendar!

Pianificazione degli eventi con Google Calendar
Google Calendar è un normalissimo calendario, molto accessibile e molto semplice da utilizzare. E grazie ad opportune API è anche facilmente programmabile anche da .NET.

Riassumo quindi in breve:

  • Quando Fsx Logger viene avviato, chiede al servizio WCF di fornirgli l’elenco delle categorie di volo disponibili
  • Il servizio WCF forma e restituisce questo elenco in tre modi: categorie di volo pubbliche e sempre disponibili a tutti; categorie di volo private ed associate all’utente che mi ha fatto la richiesta (esempio: esistono le categorie “Trainer” o “Flight School”, che diventano disponibili rispettivamente solo ai Trainer ed agli Allievi della Scuola di Volo PVI); categorie di volo schedulate attraverso Google Calendar
  • Quindi, riassumendo: il servizio WCF soddisfa la richiesta: “Sono l’utente Pippo, dammi per favore le categorie di volo che mi spettano”

La cosa a cui non avevo mai pensato, francamente, è di utilizzare Google Calendar come repository di dati, usufruibili da applicazioni esterne. Adesso quando PVI organizza un evento particolare, un contest, una gara, un tour da qualche parte, è sufficiente che io vada nel Google Calendar ed inserisca un appuntamento il cui titolo corrisponde alla categoria di volo che voglio attivare. Ed il gioco è fatto! Molto, molto più semplice di quanto avrei fatto continuando ad usare il mio database.

E Windows Phone 7, cosa c’entra? 
L’ultimo tassello in ordine di tempo è l’applicazione per Windows Phone 7, che riassume un po’ di strumenti ed utilità dedicate ai soci, ma non solo.

  • Visualizzazione del Roster PVI (in pratica, una vista in Silverlight di questa pagina Web)
  • Visualizzazione del report di volo di ciascun volo, e delle eventuali fotografie scattate
  • Consultazione dei codici IVAO dei soci PVI
  • Consultazione sito Web, Facebook, Twitter ufficiale
  • Poter scrivere ai contatti principali di PVI: segreteria, direttivo, etc.
  • Poter scrivere nella mailing-list privata di Piloti Virtuali Italiani
  • Poter richiedere l’attivazione di una licenza di Fsx Logger (che è nato come software a pagamento, ma come mio regalo a tutti i soci di PVI)

L’applicazione è ancora under-development. Vi terrò informati!

Tempo per la realizzazione del sistema
Ho cominciato a lavorarci intorno a Natale 2010, ed in certi 4 mesi l’intero progetto era up & running.
Ci stiamo lavorando ancora adesso, per migliorarlo e per correggere piccoli dettagli, ma ormai il grosso c’è.

E’ stata, e lo è tuttora, una bella soddisfazione, perchè era qualche anno che PVI soffriva di un sorta di immobilismo e di un distaccamento tra i soci. Come ho introdotto all’inizio, ciascun volo volava, ma lo faceva privatamente, e quindi nessuno sapeva cosa stessero facendo gli altri. Il sistema descritto in questo post, il cui sviluppo molto probabilmente proseguirà nei mesi a venire, ha portato alla luce tutta questa attività. Inutile dire che molte, molte persone di PVI continuano ancora oggi a ringraziarmi! Il loro contributo è stato fondamentale, perchè mi hanno spiegato e dettagliato regole di volo reali, che sono state applicate in lungo e in largo all’interno del sistema. Io posso averci messo del mio per quanto riguarda l’aspetto tecnico, ma senza di loro le cose non sarebbero così dettagliate al punto giusto.

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.