FlightGear/Un esempio di integrazione NASAL-XML

Indice del libro

L'integrazione tra l'XML e il linguaggio di script Nasal può non essere banale ad un primo approccio da parte anche di chi ha programmato, ma sicuramente un esempio pratico può dare molte più possibilità di comprensione.
L'esempio che si inserisce in questo capitolo è relativo alla aggiunta della funzionalità di configurazione del joystick che stranamente manca in FlightGear. Questa funzionalità è richiesta dal fatto che normalmente i joystick commerciali non hanno una buona stabilità sugli assi. Normalmente i 3-4 assi dovrebbero rilasciare un valore numerico tra -1 ed 1, ma in realtà questo valore può cambiare ad esempio tra -0,7 a 0,8, non solo ma lo zero ben difficilmente è 0, spesso è un valore tra -0,2 a 0,2. Tutto questo fa si che pilotare un aereo spesso è più difficile di quanto in realtà non sia.
È utile anche poter inserire un parametro che permette di dare una risposta meno lineare, come del resto avviene nella realtà.

Nota: Questo esempio è stato realizzato su di una macchina con sistema operativo Linux e quindi gli esempi sono fatti con notazione tipica di questo ambiente. Il FlightGear installato è la versione che viene compilata localmente e che quindi risulta aggiornata sempre alla ultima release di sviluppo. Questa versione può avere delle differenze rispetto a quella installata nelle varie distribuzioni di Linux e negli altri sistemi operativi come Windows e Mac OS. Comunque una persona con un minimo di pratica di programmazione non dovrebbe incontrare particolari problemi.
Il miglior sistema operativo per lo sviluppo: quasi tutto l'ambiente FlightGear è inizialmente sviluppato su macchine Linux, questo non impedisce che si possa fare le stesse cose su Windows o su Mac OS, ma sicuramente è più difficile trovare pratici sistemi di sviluppo e sicuramente l'organizzazione di questi sistemi non è così pratica per lo sviluppo come lo è invece Linux. Quindi un consiglio, per chi vuole mettere le mani all'interno del codice di FlightGear, è quello di utilizzare una qualsiasi distribuzione Linux per lo sviluppo, magari sfruttando un sistema di emulazione.

Organizzare il menu

modifica

La costruzione della applicazione inizia realizzandone un punto di avvio per mezzo di una voce di menu gestita tramite codice XML che è il mezzo di programmazione della GUI (Graphic User Interface). Questa fase va fatta a programma spento in quanto non è possibile verificarla fin quando non si riavvia l'applicazione.

Comando di avvio dal menu principale

modifica

Il file da modificare è il menubar.xml che si trova in $FG_ROOT/fgdata/gui che contiene tutte le voci di menu nella forma:

  <PropertyList>
    ...
    <menu>
      <label>File</label>
      <item> ... </item>
      <item>
        <label>Joystick Configuration</label>
          <binding>
             <command>dialog-show</command>
             <dialog-name>joystick-configuration</dialog-name>
	  </binding>
      </item>
      <item> ... </item>
    </menu>
    ...
    <menu> ... </menu>
    ...
  </PropertyList>

Analizziamo ora questo script, intanto si nota che ogni voce di menu è definita all'interno dei tag <menu> ... </menu>, questi non hanno un limite, ma ovviamente non possono essere troppi altrimenti la barra orizzontale in alto diventerebbe troppo lunga. Normalmente conviene introdurre la nuova voce all'interno di un menu già esistente, può essere una buona scelta il menu con label File (<label>File</label>) che contiene varie chiamate a funzioni di servizio. Ogni sottovoce di menu viene descritta tra i tag <item> ... </item> anche i singoli items hanno una label che non è altro la scritta visualizzata nel menu a tendina, nel nostro caso la label è: <label>Joystick Configuration</label>. A questo punto inizia la parte più importante, ovvero la chiamata alla finestra che verrà mostrata al fine di permettere la visualizzazione e modifica dei parametri. Questa finestra è anche essa descritta tramite un codice xml, questa finestra si chiama finestra di dialogo. Viene attivata all'interno di una connessione (binding) tra due differenti insiemi di codici. La finestra di dialogo viene richiamata attraverso il comando posto all'interno del tag <binding> che è: <command>dialog-show</command> che richiede un tag dialog-name con l'interno il nome del nuovo file xml di nome joystick-configuration che conterrà la descrizione della finestra di configurazione del joystick, come si vede dall'esempio tale nome è definito all'interno del tag <dialog-name>.

La finestra di dialogo: joystick-configuration.xml

modifica

La finestra di dialogo è definita all'interno di $FG_ROOT/fgdata/gui/dialogs che è la directory che raccoglie tutte le finestre di dialogo definite all'interno di FlightGear. In particolare il file joystick-configuration.xml contiene il codice xml e Nasal che permettono di avere una finestra di dialogo funzionante.

Essendo piuttosto complessa la struttura di tale finestra conviene descrivere le parti principali del codice a sezioni in quanto la struttura dell'xml permette facilmente di essere descritta con tale approccio.

Il tag PropertyList

modifica

PropertyList è il tag che definisce tutta la struttura xml che descrive la finestra di dialogo:

  <?xml version="1.0"?>
  <PropertyList>
  ...
  </PropertyList>

Da notare il tag <?xml version="1.0"?>, obbligatorio in ogni file xml, che serve all'interprete xml capire con quale particolare dialetto xml è stato utilizzato pqr quel file.

Definizione del tipo di finestra

modifica
  ...
  <name>joystick-configuration</name>
  <modal>false</modal>
  <width>400</width>
  <layout>vbox</layout>
  ...

Il nome della finestra è descritto in <name>joystick-configuration</name>, mentre con il tag <modal>false</modal> si definisce che la finestra non deve essere utilizzata in modalità modale, ovvero non deve bloccare tutti gli altri processi, cosa invece che accadrebbe se fosse tale parametri true, la modalità modale può essere utilizzata quando si richiede la massima attenzione all'utilizzatore del programma, ad esempio la richiesta di uscita definitiva dal programma.
La dimensione della finestra in pixel e il suo stile si dichiara nei tag <width> e <layout>, ove quest'ultimo tag ha il parametro è vbox in quanto il suo sviluppo sarà di tipo verticale. Nel caso che si voglia uno sviluppo della finestra di tipo orizzontale si dovrebbe invece inserire il parametro hbox.

Definizione della barra orizzontale superiore

modifica

La barra superiore della finestra è in pratica una finestra nella finestra definita all'interno dei tag <group> ... <group>, solo che il suo sviluppo non sarà verticale (vbox), ma orizzontale (hbox).

  ...
  <group>
    <layout>hbox</layout>
    <empty><stretch>1</stretch></empty>
    <text>
      <label>Joystick Configuration</label>
    </text>
    <empty><stretch>1</stretch></empty>
    <button>
      <pref-width>16</pref-width>
      <pref-height>16</pref-height>
      <legend></legend>
      <keynum>27</keynum>
      <border>2</border>
      <binding>
        <command>dialog-close</command>
      </binding>
    </button>
  </group>
  ...