<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://airwiki.elet.polimi.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AntonioTripodi</id>
		<title>AIRWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://airwiki.elet.polimi.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AntonioTripodi"/>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php/Special:Contributions/AntonioTripodi"/>
		<updated>2026-04-05T17:28:39Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.6</generator>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7715</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7715"/>
				<updated>2009-09-12T09:32:32Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:UmlTesi_v3.jpeg|600px|uml for the communication protocol]]&lt;br /&gt;
&lt;br /&gt;
link to the uml source [[media:UmlSource.zip‎]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
- Controllate le stringhe ricevute per evitare segmentation fault&lt;br /&gt;
&lt;br /&gt;
- Gestito il testing di ricezione del potenziale d'errore con l'inserimento di un nuovo attributo nel file XML con le destinazioni da raggiungere&lt;br /&gt;
&lt;br /&gt;
- Gestiti i valori di ritorno delle send con eccezioni&lt;br /&gt;
&lt;br /&gt;
- Correzione delle receive: inserimento del carattere '\0' a fine stringa e controllo della lunghezza con lunghezza massima ed eccezione&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* capitoletto su stub nella tesi + sistemare cose dette (A, E)&lt;br /&gt;
&lt;br /&gt;
* UML della comunicazione (A, E)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:UmlTesi_v3.jpeg&amp;diff=7714</id>
		<title>File:UmlTesi v3.jpeg</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:UmlTesi_v3.jpeg&amp;diff=7714"/>
				<updated>2009-09-12T09:31:54Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7667</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7667"/>
				<updated>2009-09-04T10:01:30Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:Uml.jpeg|600px|uml for the communication protocol]]&lt;br /&gt;
&lt;br /&gt;
link to the uml source [[media:UmlSource.zip‎]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
- Controllate le stringhe ricevute per evitare segmentation fault&lt;br /&gt;
&lt;br /&gt;
- Gestito il testing di ricezione del potenziale d'errore con l'inserimento di un nuovo attributo nel file XML con le destinazioni da raggiungere&lt;br /&gt;
&lt;br /&gt;
- Gestiti i valori di ritorno delle send con eccezioni&lt;br /&gt;
&lt;br /&gt;
- Correzione delle receive: inserimento del carattere '\0' a fine stringa e controllo della lunghezza con lunghezza massima ed eccezione&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* capitoletto su stub nella tesi + sistemare cose dette (A, E)&lt;br /&gt;
&lt;br /&gt;
* buffer x permutazioni: buffer molto grande e se non basta eccezione (E) &lt;br /&gt;
&lt;br /&gt;
* UML della comunicazione (A, E)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7666</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7666"/>
				<updated>2009-09-04T09:59:54Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:Uml.jpg]]&lt;br /&gt;
&lt;br /&gt;
link to the uml source [[media:UmlSource.zip‎]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
- Controllate le stringhe ricevute per evitare segmentation fault&lt;br /&gt;
&lt;br /&gt;
- Gestito il testing di ricezione del potenziale d'errore con l'inserimento di un nuovo attributo nel file XML con le destinazioni da raggiungere&lt;br /&gt;
&lt;br /&gt;
- Gestiti i valori di ritorno delle send con eccezioni&lt;br /&gt;
&lt;br /&gt;
- Correzione delle receive: inserimento del carattere '\0' a fine stringa e controllo della lunghezza con lunghezza massima ed eccezione&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* capitoletto su stub nella tesi + sistemare cose dette (A, E)&lt;br /&gt;
&lt;br /&gt;
* buffer x permutazioni: buffer molto grande e se non basta eccezione (E) &lt;br /&gt;
&lt;br /&gt;
* UML della comunicazione (A, E)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7665</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7665"/>
				<updated>2009-09-04T09:59:22Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:Uml.jpg]]&lt;br /&gt;
link to the uml source [[media:UmlSource.zip‎]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
- Controllate le stringhe ricevute per evitare segmentation fault&lt;br /&gt;
&lt;br /&gt;
- Gestito il testing di ricezione del potenziale d'errore con l'inserimento di un nuovo attributo nel file XML con le destinazioni da raggiungere&lt;br /&gt;
&lt;br /&gt;
- Gestiti i valori di ritorno delle send con eccezioni&lt;br /&gt;
&lt;br /&gt;
- Correzione delle receive: inserimento del carattere '\0' a fine stringa e controllo della lunghezza con lunghezza massima ed eccezione&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* capitoletto su stub nella tesi + sistemare cose dette (A, E)&lt;br /&gt;
&lt;br /&gt;
* buffer x permutazioni: buffer molto grande e se non basta eccezione (E) &lt;br /&gt;
&lt;br /&gt;
* UML della comunicazione (A, E)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:Uml.jpeg&amp;diff=7664</id>
		<title>File:Uml.jpeg</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:Uml.jpeg&amp;diff=7664"/>
				<updated>2009-09-04T09:57:44Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:UmlSource.zip&amp;diff=7663</id>
		<title>File:UmlSource.zip</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:UmlSource.zip&amp;diff=7663"/>
				<updated>2009-09-04T09:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7657</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7657"/>
				<updated>2009-09-03T18:01:34Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* seg fault di BCI2000 quando termina gui (o viceversa): controllare le stringhe ricevute (A)&lt;br /&gt;
&lt;br /&gt;
* capitoletto su stub nella tesi + sistemare cose dette (A, E)&lt;br /&gt;
&lt;br /&gt;
* buffer x permutazioni: buffer molto grande e se non basta eccezione (E) &lt;br /&gt;
&lt;br /&gt;
* parameters.cpp duplicato (A)&lt;br /&gt;
&lt;br /&gt;
* Messanger deve gestire il potenziale d'errore tramite lettura da file xml(A)&lt;br /&gt;
&lt;br /&gt;
* mettere a void tutti i vari listen, bind, receive... (A)&lt;br /&gt;
&lt;br /&gt;
* tirare eccezione in recvMessage se supera dimensione max buffer (E)&lt;br /&gt;
&lt;br /&gt;
* recvMessage() genera stringhe senza terminatore 0 (E)&lt;br /&gt;
&lt;br /&gt;
* migliore documentazione delle classi dei messaggi (A)&lt;br /&gt;
&lt;br /&gt;
* togliere connection.h da linuxConnection (A)&lt;br /&gt;
&lt;br /&gt;
* togliere Messanger con la a (A)&lt;br /&gt;
&lt;br /&gt;
* UML della comunicazione (A, E)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7656</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7656"/>
				<updated>2009-09-03T16:34:18Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* seg fault di BCI2000 quando termina gui (o viceversa): controllare le stringhe ricevute (A)&lt;br /&gt;
&lt;br /&gt;
* capitoletto su stub nella tesi + sistemare cose dette (A, E)&lt;br /&gt;
&lt;br /&gt;
* buffer x permutazioni: buffer molto grande e se non basta eccezione (E) &lt;br /&gt;
&lt;br /&gt;
* parameters.cpp duplicato (A)&lt;br /&gt;
&lt;br /&gt;
* Messanger deve gestire il potenziale d'errore tramite lettura da file xml(A)&lt;br /&gt;
&lt;br /&gt;
* mettere a void tutti i vari listen, bind, receive... (A)&lt;br /&gt;
&lt;br /&gt;
* tirare eccezione in recvMessage se supera dimensione max buffer (E)&lt;br /&gt;
&lt;br /&gt;
* recvMessage() genera stringhe senza terminatore 0 (E)&lt;br /&gt;
&lt;br /&gt;
* migliore documentazione delle classi dei messaggi (A)&lt;br /&gt;
&lt;br /&gt;
* togliere connection.h da linuxConnection (A)&lt;br /&gt;
&lt;br /&gt;
* togliere Messanger con la a (A)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7611</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7611"/>
				<updated>2009-08-25T12:31:33Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Il generatore di permutazioni casuali a volte crea due permutazioni uguali di fila. E' accettabile?&lt;br /&gt;
* Eliminare le dichiarazioni 'friend'?&lt;br /&gt;
* Stimoli &amp;quot;finti&amp;quot; se sono presenti solo due oggetti da stimolare?&lt;br /&gt;
* Terminare il programma con Ctrl-C&lt;br /&gt;
* sendBegin dentro o fuori dal loop?&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7610</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7610"/>
				<updated>2009-08-25T10:17:40Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Buffer dinamico oppure spezzare i messaggi complessi in più messaggi più semplici, di dimensione semi-costante o comunque piccola&lt;br /&gt;
* Gestione migliore delle stringhe&lt;br /&gt;
* Il generatore di permutazioni casuali a volte crea due permutazioni uguali di fila. E' accettabile?&lt;br /&gt;
* Eliminare le dichiarazioni 'friend'?&lt;br /&gt;
* Stimoli &amp;quot;finti&amp;quot; se sono presenti solo due oggetti da stimolare?&lt;br /&gt;
* Terminare il programma con Ctrl-C&lt;br /&gt;
* KO o OK? Implementare il messaggio confirm di Messanger (FATTO dalla parte della GUI. Dalla parte dello stub?)&lt;br /&gt;
* Segnalare tutte le stimolazioni come singole (FATTO ma ricontrollare di non averne lasciato qualcuno)&lt;br /&gt;
* sendBegin dentro o fuori dal loop?&lt;br /&gt;
* correggere i warning&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7605</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7605"/>
				<updated>2009-08-22T10:56:54Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Interattività del driver di BCI2000 ===&lt;br /&gt;
&lt;br /&gt;
Il driver di BCI2000 deve essere interarattivo: l'utente, nella fase di testing attuale, deve essere in grado di sostituirsi in tutto e per tutto a BCI2000.&lt;br /&gt;
Dunque, ad esempio, deve poter esprimere il numero di flash di sincronizzazione e, soprattutto, la destinazione scelta.&lt;br /&gt;
L'idea generale è quella di creare dei file xml che specifichino tali valori, al fine di poter visualizzare dei pattern ben definiti e riproducibili più volte.&lt;br /&gt;
Il problema cui siamo andati incontro è che BCI2000 lavora identificando le varie destinazioni con dei numeri. Chiaramente, è però molto scomodo (anzi del tutto impossibile) che l'utente specifichi le destinazioni che la GUI dovrà percorrere in questo modo e senza alcun ausilio.&lt;br /&gt;
La soluzione che abbiamo pensato da una parte preserva il formato attuale dei messaggi (che ricalca poi il formato di quelli inviati da BCI2000) e dall'altra aiuta l'utente nella compilazione del file xml.&lt;br /&gt;
Il nostro lavoro, su questo versante, si divide in due tempistiche differenti:&lt;br /&gt;
&lt;br /&gt;
1) inizialmente il file xml verrà scritto dall'utente a partire da un file txt di ausilio che deve essere creato manualmente. Tale file txt riporta, per ogni livello, il numero identificativo di ogni destinazione, numero che deve essere riportato, per l'appunto, nel file xml. &lt;br /&gt;
&lt;br /&gt;
Un esempio del file txt: 1° LIVELLO -&amp;gt; 0 = casa in Toscana 1 = casa di Como&lt;br /&gt;
2° LIVELLO - CASA IN TOSCANA -&amp;gt; 0 = primo piano 1 = secondo piano 2 = back&lt;br /&gt;
&lt;br /&gt;
2) in un secondo momento (se avremo tempo a sufficienza), il file txt verrà creato in maniera automatica dalla interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Fare uno stub &amp;quot;interattivo&amp;quot;&lt;br /&gt;
* Buffer dinamico oppure spezzare i messaggi complessi in più messaggi più semplici, di dimensione semi-costante o comunque piccola&lt;br /&gt;
* Gestione migliore delle stringhe&lt;br /&gt;
* Il generatore di permutazioni casuali a volte crea due permutazioni uguali di fila. E' accettabile?&lt;br /&gt;
* Eliminare le dichiarazioni 'friend'?&lt;br /&gt;
* Stimoli &amp;quot;finti&amp;quot; se sono presenti solo due oggetti da stimolare?&lt;br /&gt;
* Terminare il programma con Ctrl-C&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7604</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7604"/>
				<updated>2009-08-22T08:13:08Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Fare uno stub &amp;quot;interattivo&amp;quot;&lt;br /&gt;
* Buffer dinamico oppure spezzare i messaggi complessi in più messaggi più semplici, di dimensione semi-costante o comunque piccola&lt;br /&gt;
* Gestione migliore delle stringhe&lt;br /&gt;
* Il generatore di permutazioni casuali a volte crea due permutazioni uguali di fila. E' accettabile?&lt;br /&gt;
* Eliminare le dichiarazioni 'friend'?&lt;br /&gt;
* Stimoli &amp;quot;finti&amp;quot; se sono presenti solo due oggetti da stimolare?&lt;br /&gt;
* Terminare il programma con Ctrl-C&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7603</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7603"/>
				<updated>2009-08-22T08:07:11Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni casuali&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
- Aggiunto contrllo sulla pressione del tasto ''escape'' per l'uscita dal programma&lt;br /&gt;
&lt;br /&gt;
- Aggiunti indirizzo e porta di comunicazione con BCI2000 come parametri&lt;br /&gt;
&lt;br /&gt;
- Controllo dell'esistenza del font ad apertura del programma&lt;br /&gt;
&lt;br /&gt;
- Creata una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
&lt;br /&gt;
- Gestita correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP tramite l'utilizzo del terminatore \n&lt;br /&gt;
&lt;br /&gt;
- Documentati i parametri del file xml in un file txt apposito&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Fare uno stub &amp;quot;interattivo&amp;quot;&lt;br /&gt;
* Buffer dinamico e gestione migliore delle stringhe&lt;br /&gt;
* Il generatore di permutazioni casuali a volte crea due permutazioni uguali di fila. E' accettabile?&lt;br /&gt;
* Eliminare le dichiarazioni 'friend'?&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7598</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7598"/>
				<updated>2009-08-19T08:25:08Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni (che utilizza l'algoritmo di [http://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm Johnson Trotter]) per l'illuminazione della lista delle possibili opzioni. Il generatore soddisfa le richieste poste per le sequenze: nessun oggetto viene illuminato due volte consecutive e tutti gli oggetti vengono illuminati un numero uguale di volte.&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare:  [[Media:Communication_Protocol.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Creare una classe di comunicazione nella GUI che contenga tutti i metodi per la comunicazione&lt;br /&gt;
* Creare una classe di comunicazione per BCI2000 che contenga tutti i metodi per la comunicazione&lt;br /&gt;
* inizialmente ci sarà da fare una parte di sincronizzazione: lo stub invierà il numero dei lampeggi (secondo i messaggi standard spiegati sopra) e il quadrato di sincronizzazione li farà. Se la taratura del sensore ottico è corretta, il numero di flash fatti dal quadrato di sincronizzazione sarà uguale al numero inviato dallo stub&lt;br /&gt;
* Fare uno stub &amp;quot;interattivo&amp;quot;&lt;br /&gt;
* Generare permutazioni casuali&lt;br /&gt;
* La gui termini su Ctrl-C&lt;br /&gt;
* Eliminare segmentation fault se manca file font o file xml&lt;br /&gt;
* Gestire l'errore di apertura del file xml delle zone&lt;br /&gt;
* Commentare i metodi in &amp;lt;tt&amp;gt;communication.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Gestire correttamente l'individuazione dei confini dei messaggi all'interno del flusso TCP&lt;br /&gt;
* Mettere indirizzo e porta tra i parametri&lt;br /&gt;
* Documentare i parametri nel file Xml&lt;br /&gt;
* Eliminare le dichiarazioni 'friend'?&lt;br /&gt;
* il controllo della presenza/assenza del font deve essere all'inizio del programma&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7591</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7591"/>
				<updated>2009-08-17T07:56:41Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni (che utilizza l'algoritmo di [http://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm Johnson Trotter]) per l'illuminazione della lista delle possibili opzioni. Il generatore soddisfa le richieste poste per le sequenze: nessun oggetto viene illuminato due volte consecutive e tutti gli oggetti vengono illuminati un numero uguale di volte.&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare [[Media:comm protocol.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Da fare ===&lt;br /&gt;
&lt;br /&gt;
* Creare una classe di comunicazione nella GUI che contenga tutti i metodi per la comunicazione&lt;br /&gt;
* inizialmente ci sarà da fare una parte di sincronizzazione: lo stub invierà il numero dei lampeggi (secondo i messaggi standard spiegati sopra) e il quadrato di sincronizzazione li farà.&lt;br /&gt;
Se la taratura del sensore ottico è corretta, il numero di flash fatti dal quadrato di sincronizzazione sarà uguale al numero inviato dallo stub&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7590</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7590"/>
				<updated>2009-08-17T07:45:40Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* DA FARE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni (che utilizza l'algoritmo di [http://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm Johnson Trotter]) per l'illuminazione della lista delle possibili opzioni. Il generatore soddisfa le richieste poste per le sequenze: nessun oggetto viene illuminato due volte consecutive e tutti gli oggetti vengono illuminati un numero uguale di volte.&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
=== Protocollo di comunicazione ===&lt;br /&gt;
&lt;br /&gt;
In allegato il file che spiega la struttura e il funzionamento dei messaggi che devono essere scambiati per far sì che GUI e interfaccia grafica possano comunicare [[Media:comm protocol.zip]]&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:Comm_protocol.zip&amp;diff=7589</id>
		<title>File:Comm protocol.zip</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:Comm_protocol.zip&amp;diff=7589"/>
				<updated>2009-08-17T07:42:21Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: protocollo di comunicazione tra gui e bci2000&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;protocollo di comunicazione tra gui e bci2000&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=7588</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=7588"/>
				<updated>2009-08-17T06:08:38Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi@mail.polimi.it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|photo=tre.jpg|200px|thumb|center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2006-2009'': Corso di laurea triennale in ingegneria informatica presso il Polo Regionale di Como del Politecnico di Milano&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''2009'': Tesista presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (all'interno del progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7587</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7587"/>
				<updated>2009-08-17T06:00:48Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Ottavo incontro (07/08/2009) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni (che utilizza l'algoritmo di [http://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm Johnson Trotter]) per l'illuminazione della lista delle possibili opzioni. Il generatore soddisfa le richieste poste per le sequenze: nessun oggetto viene illuminato due volte consecutive e tutti gli oggetti vengono illuminati un numero uguale di volte.&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
=== DA FARE ===&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7586</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7586"/>
				<updated>2009-08-17T05:58:29Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
=== Ottavo incontro (07/08/2009) ===&lt;br /&gt;
&lt;br /&gt;
* In questo incontro abbiamo deciso di concentrarci sullo sviluppo dell'interfaccia grafica, migliorando le funzionalità già presenti, piuttosto che incominciare a studiare la comunicazione tra GUI e BCI2000, che sarà oggetto della tesi/progetto di qualche altro studente.&lt;br /&gt;
* Le cose che dobbiamo dunque fare sono: miglioramento della struttura attuale (migliore modularizzazione e razionalizzazione del codice), creazione di un generatore di permutazioni per illuminare le zone/stanze/locazioni, creazione di una classe di comunicazione tra GUI e BCI2000. Il nostro compito, come detta sarà quello di configurare solo il lato dell'interfaccia grafica, creando altresì uno stub per simulare il funzionamento di BCI2000.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Verificata la compatibilità della classe di comunicazione di BCI2000 in Linux&lt;br /&gt;
&lt;br /&gt;
- Creato un generatore di permutazioni (che utilizza l'algoritmo di Johnson Trotter [http://en.wikipedia.org/wiki/Steinhaus%E2%80%93Johnson%E2%80%93Trotter_algorithm]) per l'illuminazione della lista delle possibili opzioni. Il generatore soddisfa le richieste poste per le sequenze: nessun oggetto viene illuminato due volte consecutive e tutti gli oggetti vengono illuminati un numero uguale di volte.&lt;br /&gt;
&lt;br /&gt;
- Sollevate delle eccezioni ogni qualvolta il file XML appena caricato presenta delle incoerenze&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di limitare l'altezza dei box per le zone&lt;br /&gt;
&lt;br /&gt;
- Aggiunto un parametro che permette di impostare la dimensione del carattere per la scrittura su finestra SDL&lt;br /&gt;
&lt;br /&gt;
- Sistemati gli header dei file in modo che siano visualizzati anche i nomi dei parametri, e che i commenti siano significativi (input / output della funzione segnalati, utlità della funzione...)&lt;br /&gt;
&lt;br /&gt;
- Eliminato l'attributo ''type'' da ''Node''&lt;br /&gt;
&lt;br /&gt;
- Per quanto riguarda il rettangolo di sincronizzazione abbiamo deciso di mantenere modificabili solo le dimensioni (larghezza ed altezza)ed il posizionamento sull'asse verticale, poichè la posizione sull'asse delle x è calcolata a partire dalla larghezza della fienstra SDL e dalla larghezza della cornice (parametri ''areaX'' e ''externalEdge''): in questo modo il rettangolo è sempre mantenuto sul lato destro della finestra SDL, come nelle specifiche date inizialmente&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DA FARE ===&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7526</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7526"/>
				<updated>2009-08-02T08:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 20 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Nuovi costruttori&lt;br /&gt;
- Feedback della scelta&lt;br /&gt;
&lt;br /&gt;
* '''DA FARE''' &lt;br /&gt;
- installazione di BCI2000 sui nostri computer e inizio del lavoro di connessione, controllando innanzitutto se la classe di comunicazione socket di BCI2000 è esportabile sotto Linux, magari con l'apporto di piccole modifiche&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7525</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7525"/>
				<updated>2009-08-02T08:16:27Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Settimo incontro (30/07/2009) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Si è deciso di eliminare la funzione navigateAndFill che fino ad ora si occupava di creare la struttura dati, optando per l'&amp;quot;inglobamento&amp;quot; di tale funzione all'interno dei vari costruttori che, ora, dovranno anche navigare l'albero xml in cui viene descritta la mappa.&lt;br /&gt;
* Bisogna aggiungere una funzione che, all'interno della select, mostri quella che è stata la scelta appena effettuata, al fine di avere un ulteriore feedback da parte dell'utente.&lt;br /&gt;
* Si è cominciato a discutere di quello che deve essere il nostro lavoro per la seconda parte del progetto, ovvero quella che riguarda la comunicazione tra lanostra nuova GUI e BCI2000/Galileo (che sono già installati sulla lurch).&lt;br /&gt;
Si è deciso di suddividere il lavoro in questo modo: agosto -&amp;gt; creazione del protocollo di comunicazione in locale nei nostri pc, utilizzando delle connessioni &amp;quot;fake&amp;quot;; settembre (primi 15 giorni) -&amp;gt; trasporto del tutto nel contesto reale; 22 settembre -&amp;gt; laurea&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7524</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7524"/>
				<updated>2009-08-02T08:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Sesto incontro (24/07/2009) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Risoluzione dei problemi con i setter&lt;br /&gt;
* Discussione sulla realizzazione della seconda parte della tesi, riguardante la comunicazione tra la nuova GUI e il software BCI2000 (da realizzarsi entro settembre prossimo)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Projects&amp;diff=7483</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Projects&amp;diff=7483"/>
				<updated>2009-07-30T06:20:42Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Brain-Computer Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''This page is a repository of links to the pages describing the '''projects''' we are currently working on at AIRLab. &lt;br /&gt;
See the list of our finished projects on the [[Finished Projects]] page.''&lt;br /&gt;
&lt;br /&gt;
== Ongoing projects ==&lt;br /&gt;
''by research area (areas are defined in the [[Main Page]]); for each project a name and a link to its AIRWiki page is given''&lt;br /&gt;
&lt;br /&gt;
=== [[Agents, Multiagent Systems, Agencies]] ===&lt;br /&gt;
----&lt;br /&gt;
* [[Evolutionary game theory for biology| Evolutionary game theory for biology]]&lt;br /&gt;
* [[Game theoretic analysis of electric power| Game theoretic analysis of electric power market]]&lt;br /&gt;
* [[Algorithms for computing equilibria| Algorithms for computing equilibria]]&lt;br /&gt;
* [[Multiagent cooperation|Multiagent cooperating system]]&lt;br /&gt;
* [[Planning in Ambient Intelligence scenarios| Planning in Ambient Intelligence scenarios]]&lt;br /&gt;
* [[Strategic robot patrolling| Strategic robot patrolling]]&lt;br /&gt;
* [[Real-Time Strategy Games| Real-Time Strategy Games]]&lt;br /&gt;
&lt;br /&gt;
=== [[BioSignal Analysis]] ===&lt;br /&gt;
----&lt;br /&gt;
===== [[Affective Computing]] =====&lt;br /&gt;
* [[Relatioship between Cognition and Emotion in Rehabilitation Robotics]]&lt;br /&gt;
* [[Driving companions]]&lt;br /&gt;
* [[Emotion from Interaction]]&lt;br /&gt;
* [[Wireless Affective Devices]]&lt;br /&gt;
* [[Affective Robot force sensor]]&lt;br /&gt;
* [[Affective VideoGames]]&lt;br /&gt;
&lt;br /&gt;
===== [[Brain-Computer Interface]] =====&lt;br /&gt;
* [[BCI based on Motor Imagery]]&lt;br /&gt;
** [[Predictive BCI Speller based on Motor Imagery]] (Master thesis, Tiziano D'Albis)&lt;br /&gt;
** [[Feature Selection and Extraction for a BCI based on motor imagery]] (Master thesis, Francesco Amenta)&lt;br /&gt;
** [[Ocular Artifacts Filter implementation for a BCI based on motor imagery]] (First Level thesis, Fabio Beltramini)&lt;br /&gt;
** [[Online automatic tuning of the number of repetitions in a P300-based BCI]] (First Level thesis, Siegfried Cattaneo)&lt;br /&gt;
* [[Graphical user interface for an autonomous wheelchair]] (First Level thesis, Antonio Tripodi and Eleonora Ciceri)&lt;br /&gt;
* [[Mu and beta rhythm-based BCI]]&lt;br /&gt;
&lt;br /&gt;
===== [[Automatic Detection Of Sleep Stages]] =====&lt;br /&gt;
* [[Sleep Staging with HMM]]&lt;br /&gt;
&lt;br /&gt;
===== [[Analysis of the Olfactory Signal]] =====&lt;br /&gt;
* [[Lung Cancer Detection by an Electronic Nose]]&lt;br /&gt;
* [[HE-KNOWS - An electronic nose]]&lt;br /&gt;
&lt;br /&gt;
===== [[Classification of EMG signals]] =====&lt;br /&gt;
&lt;br /&gt;
=== [[Computer Vision and Image Analysis]] ===&lt;br /&gt;
----&lt;br /&gt;
* [[Automated extraction of laser streaks and range profiles]]&lt;br /&gt;
* [[Data collection for mutual calibration|Data collection for laser-rangefinder and camera calibration]]&lt;br /&gt;
* [[Image retargeting by k-seam removal]]&lt;br /&gt;
* [[Particle filter for object tracking]]&lt;br /&gt;
* [[Template based paper like reconstruction when the edges are straight]]&lt;br /&gt;
* [[Wii Remote headtracking and active projector]]&lt;br /&gt;
* [[Vision module for the Milan Robocup Team]]&lt;br /&gt;
* [[Long Exposure Images for Resource-constrained video surveillance]]&lt;br /&gt;
* [[NonPhotorealistic rendering of speed lines]].&lt;br /&gt;
* [[Restoration of blurred objects using cues from the alpha matte]]&lt;br /&gt;
* [[Analyzing Traffic Speed From a Single Night Image - Light Streaks Detection]]&lt;br /&gt;
* [[Plate detection algorithm]]&lt;br /&gt;
* [[A vision-based 3D input device for space curves]]&lt;br /&gt;
* [[Correlation-based 3D reconstruction with pan/tilt stereo-camera]]&lt;br /&gt;
* [[Inverse scaling parametrization for Monocular Simultaneous Localization and Mapping]]&lt;br /&gt;
* [[Image resize by solving a sparse linear system]]&lt;br /&gt;
* [[Monocular Simultaneous Localization And Mapping with Moving Object Tracking using Conditional Independent submaps]]&lt;br /&gt;
&lt;br /&gt;
=== [[Machine Learning]] ===&lt;br /&gt;
----&lt;br /&gt;
* [[Adaptive Reinforcement Learning Multiagent Coordination in Real-Time Computer Games|Adaptive Reinforcement Learning Multiagent Coordination in Real-Time Computer Games]]&lt;br /&gt;
* [[B-Smart Behaviour Sequence Modeler and Recognition tool|B-Smart Behaviour Sequence Modeler and Recognition tool]]&lt;br /&gt;
* [[Player modeling in TORCS exploiting SVMs and GPUs parallelism|Player modeling in TORCS exploiting SVMs and GPUs parallelism]]&lt;br /&gt;
* [[Development an Artificial Intelligence System solving the MS Pac-Man videogame |Development an Artificial Intelligence System solving the MS Pac-Man videogame ]]&lt;br /&gt;
* [[Parameters optimization in TORCS exploiting genetic algorithms]]&lt;br /&gt;
* [[Neuroevolution in TORCS for evolving interesting and adaptive behaviors]]&lt;br /&gt;
* [[Giskar - Distance estimation through single camera features applied to Neural Networks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Evolutionary Computation]] ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* [[Evoptool: Evolutive Optimization Tool]]&lt;br /&gt;
&lt;br /&gt;
=== [[Philosophy of Artificial Intelligence]] ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== [[Robotics]] ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== [[Robot development]] ====&lt;br /&gt;
* [[Robot fiera]]&lt;br /&gt;
* [[LURCH - The autonomous wheelchair]]&lt;br /&gt;
* [[Balancing robots: Tilty, TiltOne]]&lt;br /&gt;
* [[Robotizing a Golf Cart ]]&lt;br /&gt;
* [[ Development of a neck for umanoid robot ]]&lt;br /&gt;
* [[Development of robot Maximum One - control and programming ]]&lt;br /&gt;
* [[Milan Robocup Team Robot development ]]&lt;br /&gt;
* [[Modular Robotic Toolkit ]]&lt;br /&gt;
* [[Indoor localization system based on a gyro and visual passive markers]]&lt;br /&gt;
* [[Integrazione Tesi De Ambrogi]]&lt;br /&gt;
&lt;br /&gt;
==== [[Benchmarking]] ====&lt;br /&gt;
* [[Rawseeds|RAWSEEDS]]&lt;br /&gt;
&lt;br /&gt;
==== [[Bio Robotics]] ====&lt;br /&gt;
* [[PoliManus]]&lt;br /&gt;
* [[ZOIDBERG - An autonomous bio-inspired RoboFish]]&lt;br /&gt;
* [[Styx The 6 Whegs Robot]]&lt;br /&gt;
* [[PolyGlove: a body-based haptic interface]]&lt;br /&gt;
* [[ULISSE]]&lt;br /&gt;
* [[PEKeB: a PiezoElectric KeyBoard]]&lt;br /&gt;
* [[Anthropomorphic Robotic Wrist]]&lt;br /&gt;
* [[High-level architecture for the control of humanoid robot]]&lt;br /&gt;
* [[Zoidberg II, powering robot fish]]&lt;br /&gt;
* [[EMG, new test]]&lt;br /&gt;
* [[CPG for Warugadar]]&lt;br /&gt;
&lt;br /&gt;
==== [[Robogames]] ====&lt;br /&gt;
* [[ROBOWII]]&lt;br /&gt;
* [[RobogameDesign]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Social Software and Semantic Web]] ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
====== Extracting Knowledge From Social Networks ======&lt;br /&gt;
&lt;br /&gt;
* [[Techniques to analyze the Wikipedia Social Network]]&lt;br /&gt;
&lt;br /&gt;
====== Semantic search ======&lt;br /&gt;
&lt;br /&gt;
* [[SeQuEx|SeQuEx: Semantic query expansion]]&lt;br /&gt;
&lt;br /&gt;
== Past projects ==&lt;br /&gt;
&lt;br /&gt;
=== [[BioSignal Analysis]] ===&lt;br /&gt;
&lt;br /&gt;
===== [[Affective Computing]] =====&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[Category:Project]][[prjResTopic::Affective Computing]] [[PrjEnd::&amp;lt;{{CURRENTYEAR}}/{{CURRENTMONTH}}/{{CURRENTDAY}}]]|format=ul}}&lt;br /&gt;
&lt;br /&gt;
===== [[Brain-Computer Interface]] =====&lt;br /&gt;
* [[Online P300 and ErrP recognition with BCI2000]]&lt;br /&gt;
&lt;br /&gt;
== April Fool's projects ==&lt;br /&gt;
&lt;br /&gt;
Following the [http://en.wikipedia.org/wiki/April_Fools%27_Day_RFC RFC] tradition,&lt;br /&gt;
[[April_1st_Projects|here]] is our April Fool's project page.&lt;br /&gt;
&lt;br /&gt;
== Note for students ==	&lt;br /&gt;
&lt;br /&gt;
If you are a student and there isn't a '''page describing your project''', this is because YOU have the task of creating it and populating it with (meaningful) content. If you are a student and there IS a page describing your project, you have the task to complete that page with (useful and comprehensive) information about your own contribution to the project. Be aware that the quality of your work (or lack of it) on the AIRWiki will be evaluated by the Teachers and will influence your grades.&lt;br /&gt;
&lt;br /&gt;
Instructions to add a new project or to add content to an existing project page are available at [[Projects - HOWTO]].&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7413</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7413"/>
				<updated>2009-07-29T08:36:21Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate (quinto e sesto incontro).&lt;br /&gt;
&lt;br /&gt;
- Ancora dei problemi per quello che riguarda i costruttori e i setter&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Risoluzione dei problemi con i setter&lt;br /&gt;
* Discussione sulla realizzazione della seconda parte della tesi, riguardante la comunicazione tra la nuova GUI e il software BCI2000 (da realizzarsi entro settembre prossimo)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7412</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7412"/>
				<updated>2009-07-29T08:35:40Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;br /&gt;
&lt;br /&gt;
=== Sesto incontro (24/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* E' necessario ripensare in parte il meccanismo di fornitura degli attributi delle zone, stanze ecc: invece di usare dei semplici metodi getter (che di fatto violano il concetto di information hiding, in quanto forniscono delle informazioni all'interno di classi non di loro competenza) è meglio creare dei metodi appositi che incapsulano al loro interno il codice di modifica degli attributi. Effetto di tale modifica è anche quello di operare un'ulteriore modularizzazione del codice,&lt;br /&gt;
&lt;br /&gt;
* Invece di usare dei setter per la creazione della struttura, è buona cosa sostituirli con dei costruttori pensati appositamente.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella ptrFinalVersion)&lt;br /&gt;
- Riscrittura del codice secondo le indicazioni sopra riportate nel quinto e sesto incontro.&lt;br /&gt;
&lt;br /&gt;
- Ancora dei problemi per quello che riguarda i costruttori e i setter&lt;br /&gt;
&lt;br /&gt;
=== Settimo incontro (30/07/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Risoluzione dei problemi con i setter&lt;br /&gt;
* Discussione sulla realizzazione della seconda parte della tesi, riguardante la comunicazione tra la nuova GUI e il software BCI2000 (da realizzarsi entro settembre prossimo)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7074</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7074"/>
				<updated>2009-06-10T06:34:18Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat - cartella versiontwo)&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7073</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7073"/>
				<updated>2009-06-10T06:32:24Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO (disponibile su AIRbat - cartella versiontwo)'''&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
=== Quinto incontro (05/06/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Nella precedente versione della struttura dati era stato creato un albero per riprodurre fedelmente quella che era la struttura del file xml in un novo file in memoria. Questa soluzione è funzionalmente corretta, ma in realtà inutile: il nostro fine è quello di creare una applicazione che deve funzionare in un ambito ben specifico, e non è dunque necessario approntare un modello generale, che può essere utilizzato in diverse situazioni. Inoltre un albero è per definizione un qualcosa di dinamico, che può crescere nel tempo: nel nostro caso, invece, la struttura viene creata una volta sola (quando viene parsato l'albero xml) e poi non viene più modificata.&lt;br /&gt;
&lt;br /&gt;
* La soluzione che è stata concordata è stata quella di &amp;quot;appiattire&amp;quot; la struttura ad albero (con l'eliminazione dei puntatori a nodo padre, figlio e fratello) e di inserire delle strutture vector (che fondamentalmente possono essere visti come degli &amp;quot;array dinamici&amp;quot;) in cui vengono elencati tutti i vari figli di un particolare nodo.&lt;br /&gt;
&lt;br /&gt;
* Verrà mantenuta la struttura gerarchica precedente, ma la classe Node diventerà una classe astratta, i cui metodi principali (draw, highlight e select) dovranno essere implementati nelle classi figlie.&lt;br /&gt;
&lt;br /&gt;
* I nodi xml polyline, location e contour non erediteranno da Node, ma saranno delle semplici strutture (dato che non hanno bisogno dei tre metodi principali) che saranno incluse nelle varie room.&lt;br /&gt;
&lt;br /&gt;
* Verrà creato un file header in cui inserire tutte le costanti che saranno utilizzate nell'applicazione: in questo modo è più facile trovarle e modificarle nel caso ce ne fosse bisogno.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7072</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=7072"/>
				<updated>2009-06-10T06:16:11Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure_v2.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure_v2.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO (disponibile su AIRbat - cartella versiontwo)'''&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
* '''FATTO (disponibile a breve nella sezione Struttura dati)'''&lt;br /&gt;
&lt;br /&gt;
- Definizione della nuova struttura dati adottata per separare da un punto di vista logico il file in cui la mappa è descritta da quello in cui è manipolato.&lt;br /&gt;
&lt;br /&gt;
=== Creazione della struttura dati - idee e problematiche ===&lt;br /&gt;
&lt;br /&gt;
(Quando la struttura dati prenderà la sua forma definitiva, questa sezione sarà trasferita nella parte alta della pagina, in una sottosezione dedicata)&lt;br /&gt;
&lt;br /&gt;
Come chiarito nell'incontro precedente, lo sviluppo di una struttura dati adeguata riveste un ruolo molto importante nell'intera architettura dell'interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
* Attualmente la struttura è un albero a puntatori. I nodi sono divisi in base alla loro natura: esiste un tipo padre Node (che dovrà essere implementato come astratto) e diversi tipi figli, a seconda del tag del file XML (worldNode, zoneNode, mapNode, roomNode, locationNode, polylineNode, contourNode). Il tipo Node serve per poter creare dei puntatori che possano navigare l'albero stesso, in quanto non possiamo sapere a priori i tipi di nodo dei figli. La struttura generale di un nodo è di questo tipo: una prima parte con gli attributi del nodo stesso e una seconda parte con puntatori al padre, al primo figlio e al fratello di destra. In realtà è possibile che alcuni tipi figli non abbiano attributi o alcuni de puntatori (a seconda della loro struttura definita nel paragrafo 2: Map representation). ''Problematica'': così facendo, trattiamo la struttura dati come un qualcosa di dinamico, che può crescere nel tempo. In realtà la struttura è statica e fissata a priori. Si può dunque pensare di usare semplicemente un vettore di nodi. ''Risoluzione'': al momento, implementeremo la struttura dati con gli alberi a puntatori. Lo studio per l'eventuale modifica in una struttura vettoriale verrà preso in considerazione con i docenti nel prossimo incontro che verrà fissato.&lt;br /&gt;
&lt;br /&gt;
* Bisogna trasformare il tipo padre Node in una classe astratta, in cui i metodi siano virtual, dato che non viene mai implementata: quelle che vengono fisicamente create sono le classi figlie.&lt;br /&gt;
&lt;br /&gt;
* Bisogna implementare le funzioni di cui al momento abbiamo scritto solo l'intestazione. Una volta che ciò sarà fatto, sarà possibile ragionare in modo più concreto sulla struttura, apportando eventuali miglioramenti.&lt;br /&gt;
&lt;br /&gt;
* Esistono dei metodi XXXExtract che vanno ad estrarre i diversi attributi dei nodi. Dato che gli attributi ritornati sono di tipi diversi, non è possibile creare una funzione sola. Una volta che saranno implementate le funzioni, sarà possibile ragionare anche su questo problema.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:Lurch_map_xml_structure_v2.png&amp;diff=7071</id>
		<title>File:Lurch map xml structure v2.png</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:Lurch_map_xml_structure_v2.png&amp;diff=7071"/>
				<updated>2009-06-10T06:14:34Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: png of the second version of bci map representation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;png of the second version of bci map representation&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:Lurch_map_xml_structure_v2.zip&amp;diff=7070</id>
		<title>File:Lurch map xml structure v2.zip</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:Lurch_map_xml_structure_v2.zip&amp;diff=7070"/>
				<updated>2009-06-10T06:13:45Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: second version of the structure of lurch map representation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;second version of the structure of lurch map representation&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6944</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6944"/>
				<updated>2009-06-02T07:27:11Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Quarto incontro (11/05/2009) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure.odg.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''FATTO (disponibile su AIRbat - cartella versiontwo)'''&lt;br /&gt;
- Riscrittura del codice secondo la nuova struttura dati adottata&lt;br /&gt;
&lt;br /&gt;
- Il codice è stato modularizzato&lt;br /&gt;
&lt;br /&gt;
* '''FATTO (disponibile a breve nella sezione Struttura dati)'''&lt;br /&gt;
&lt;br /&gt;
- Definizione della nuova struttura dati adottata per separare da un punto di vista logico il file in cui la mappa è descritta da quello in cui è manipolato.&lt;br /&gt;
&lt;br /&gt;
=== Creazione della struttura dati - idee e problematiche ===&lt;br /&gt;
&lt;br /&gt;
(Quando la struttura dati prenderà la sua forma definitiva, questa sezione sarà trasferita nella parte alta della pagina, in una sottosezione dedicata)&lt;br /&gt;
&lt;br /&gt;
Come chiarito nell'incontro precedente, lo sviluppo di una struttura dati adeguata riveste un ruolo molto importante nell'intera architettura dell'interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
* Attualmente la struttura è un albero a puntatori. I nodi sono divisi in base alla loro natura: esiste un tipo padre Node (che dovrà essere implementato come astratto) e diversi tipi figli, a seconda del tag del file XML (worldNode, zoneNode, mapNode, roomNode, locationNode, polylineNode, contourNode). Il tipo Node serve per poter creare dei puntatori che possano navigare l'albero stesso, in quanto non possiamo sapere a priori i tipi di nodo dei figli. La struttura generale di un nodo è di questo tipo: una prima parte con gli attributi del nodo stesso e una seconda parte con puntatori al padre, al primo figlio e al fratello di destra. In realtà è possibile che alcuni tipi figli non abbiano attributi o alcuni de puntatori (a seconda della loro struttura definita nel paragrafo 2: Map representation). ''Problematica'': così facendo, trattiamo la struttura dati come un qualcosa di dinamico, che può crescere nel tempo. In realtà la struttura è statica e fissata a priori. Si può dunque pensare di usare semplicemente un vettore di nodi. ''Risoluzione'': al momento, implementeremo la struttura dati con gli alberi a puntatori. Lo studio per l'eventuale modifica in una struttura vettoriale verrà preso in considerazione con i docenti nel prossimo incontro che verrà fissato.&lt;br /&gt;
&lt;br /&gt;
* Bisogna trasformare il tipo padre Node in una classe astratta, in cui i metodi siano virtual, dato che non viene mai implementata: quelle che vengono fisicamente create sono le classi figlie.&lt;br /&gt;
&lt;br /&gt;
* Bisogna implementare le funzioni di cui al momento abbiamo scritto solo l'intestazione. Una volta che ciò sarà fatto, sarà possibile ragionare in modo più concreto sulla struttura, apportando eventuali miglioramenti.&lt;br /&gt;
&lt;br /&gt;
* Esistono dei metodi XXXExtract che vanno ad estrarre i diversi attributi dei nodi. Dato che gli attributi ritornati sono di tipi diversi, non è possibile creare una funzione sola. Una volta che saranno implementate le funzioni, sarà possibile ragionare anche su questo problema.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6666</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6666"/>
				<updated>2009-05-28T08:24:09Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure.odg.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''DA FARE'''&lt;br /&gt;
- Creare una nuova directory che contenga il codice principale del progetto&lt;br /&gt;
&lt;br /&gt;
- Modularizzare il progetto, definendo strutture dati e funzioni con uno scopo preciso&lt;br /&gt;
&lt;br /&gt;
- Scrivere lo schema delle strutture dati: definizione delle classi con metodi e attributi principali (senza codice), ed esempio di come verrebbero usate nelle funzioni principali in (pseudo)codice.&lt;br /&gt;
&lt;br /&gt;
=== Creazione della struttura dati - idee e problematiche ===&lt;br /&gt;
&lt;br /&gt;
(Quando la struttura dati prenderà la sua forma definitiva, questa sezione sarà trasferita nella parte alta della pagina, in una sottosezione dedicata)&lt;br /&gt;
&lt;br /&gt;
Come chiarito nell'incontro precedente, lo sviluppo di una struttura dati adeguata riveste un ruolo molto importante nell'intera architettura dell'interfaccia grafica.&lt;br /&gt;
&lt;br /&gt;
* Attualmente la struttura è un albero a puntatori. I nodi sono divisi in base alla loro natura: esiste un tipo padre Node (che dovrà essere implementato come astratto) e diversi tipi figli, a seconda del tag del file XML (worldNode, zoneNode, mapNode, roomNode, locationNode, polylineNode, contourNode). Il tipo Node serve per poter creare dei puntatori che possano navigare l'albero stesso, in quanto non possiamo sapere a priori i tipi di nodo dei figli. La struttura generale di un nodo è di questo tipo: una prima parte con gli attributi del nodo stesso e una seconda parte con puntatori al padre, al primo figlio e al fratello di destra. In realtà è possibile che alcuni tipi figli non abbiano attributi o alcuni de puntatori (a seconda della loro struttura definita nel paragrafo 2: Map representation). ''Problematica'': così facendo, trattiamo la struttura dati come un qualcosa di dinamico, che può crescere nel tempo. In realtà la struttura è statica e fissata a priori. Si può dunque pensare di usare semplicemente un vettore di nodi. ''Risoluzione'': al momento, implementeremo la struttura dati con gli alberi a puntatori. Lo studio per l'eventuale modifica in una struttura vettoriale verrà preso in considerazione con i docenti nel prossimo incontro che verrà fissato.&lt;br /&gt;
&lt;br /&gt;
* Bisogna trasformare il tipo padre Node in una classe astratta, in cui i metodi siano virtual, dato che non viene mai implementata: quelle che vengono fisicamente create sono le classi figlie.&lt;br /&gt;
&lt;br /&gt;
* Bisogna implementare le funzioni di cui al momento abbiamo scritto solo l'intestazione. Una volta che ciò sarà fatto, sarà possibile ragionare in modo più concreto sulla struttura, apportando eventuali miglioramenti.&lt;br /&gt;
&lt;br /&gt;
* Esistono dei metodi XXXExtract che vanno ad estrarre i diversi attributi dei nodi. Dato che gli attributi ritornati sono di tipi diversi, non è possibile creare una funzione sola. Una volta che saranno implementate le funzioni, sarà possibile ragionare anche su questo problema.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6665</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6665"/>
				<updated>2009-05-28T07:48:57Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: /* Quarto incontro (11/05/2009) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure.odg.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: per essere certi di veder visualizzati tutti gli eventuali warning, in fase di compilazione bisogna digitare sia -Wall che -W&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''DA FARE'''&lt;br /&gt;
- Creare una nuova directory che contenga il codice principale del progetto&lt;br /&gt;
&lt;br /&gt;
- Modularizzare il progetto, definendo strutture dati e funzioni con uno scopo preciso&lt;br /&gt;
&lt;br /&gt;
- Scrivere lo schema delle strutture dati: definizione delle classi con metodi e attributi principali (senza codice), ed esempio di come verrebbero usate nelle funzioni principali in (pseudo)codice.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6265</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=6265"/>
				<updated>2009-05-11T20:28:21Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure.odg.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su AIRbat)&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte).&lt;br /&gt;
&lt;br /&gt;
=== Quarto incontro (11/05/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato dedicato alla discussione di alcuni problemi riscontrati nella fase di scrittura e ingegnerizzazione del codice.&lt;br /&gt;
&lt;br /&gt;
* Warning: pur scrivendo il comando -Wall in fase di compliazione, la nostra versione di gcc(a differenza di altre) non segnala alcuni warning. Per questo motivo, nel caso in cui qualcuno ne trovasse nei sorgenti caricati su AIRbat, può tranquillamente segnalarci la riga e il motivo del warning e noi ci attiveremo per eliminarli.&lt;br /&gt;
&lt;br /&gt;
* Header: nei file .h bisogna solamente inserire la definizione della funzione e non la funzione di per sè: è un errore dal punto di vista logico, ma può creare anche problemi di funzionamento (doppie definizioni...). &lt;br /&gt;
&lt;br /&gt;
* Modularizzazione: l'idea è quella di creare tante funzioni piccole che fanno poche cose molto precise, anche in un'ottica di eventuale riuso e manutenzione. Si può implementare una funzione che crea la struttura dati dal file XML e una che la usa. All'interno di quest'ultima, altre funzioni che passano da un menu all'altro, che disegnano la schermata per gli elenchi, che disegnano la schermata per le cartine, che illuminano gli elenchi, che illuminano le cartine...&lt;br /&gt;
&lt;br /&gt;
* XML: creare una struttura dati esterna per evitare di dover usare direttamente il file XML che descrive gli ambienti da visualizzare. Questo per problematiche di efficienza, ma soprattutto per separare da un punto di vista logico la descrizione del problema e la struttura per la sua soluzione. L'idea è quella di creare un albero &amp;quot;gemello&amp;quot;, eliminando tutti i nodi aggiuntivi (e inutili ai nostri fini) del file XML (commenti...)&lt;br /&gt;
&lt;br /&gt;
* '''DA FARE'''&lt;br /&gt;
- Creare una nuova directory che contenga il codice principale del progetto&lt;br /&gt;
&lt;br /&gt;
- Modularizzare il progetto, definendo strutture dati e funzioni con uno scopo preciso&lt;br /&gt;
&lt;br /&gt;
- Scrivere lo schema delle strutture dati: definizione delle classi con metodi e attributi principali (senza codice), ed esempio di come verrebbero usate nelle funzioni principali in (pseudo)codice.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5941</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5941"/>
				<updated>2009-04-13T06:10:16Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* Feasibility check: [http://www.wxwidgets.org/ wxWidgets] and [http://maiaproject.sourceforge.net/ OpenMaia].  Check if using OpenMaia with wxWidgets is okay for the stimulation synchronization.  The timing difference between the highlighting of a choice and the switching of the synchronization square should be no more than the duration of a screen frame (about 16 ms for a 60 Hz screen).&lt;br /&gt;
&lt;br /&gt;
* Writing of a communication protocol between the BCI2000 developed in the project [[Online P300 and ErrP recognition with BCI2000]].  To be done together with [[User:AndreaSgarlata|Andrea Sgarlata]].&lt;br /&gt;
&lt;br /&gt;
* Development of a storage system to store information about the layout and the action of the interfaces; an extension of the XML format used by OpenMaia to describe keyboards should be possible.&lt;br /&gt;
&lt;br /&gt;
==Map representation==&lt;br /&gt;
[[Image:Lurch_map_xml_structure.png|600px|xml map structure]]&lt;br /&gt;
&lt;br /&gt;
link to OpenOffice Draw source [[media:Lurch_map_xml_structure.odg.zip‎]]&lt;br /&gt;
&lt;br /&gt;
link to a simple example [[media:Lurch_map_xml_example.xml.zip]] '''complete this example, it's very minimal'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* If there is no map in a zone, the interface will show only the names of the the possible destinations (i.e., zones).  If there is a map, zones are drawn as polygons ().&lt;br /&gt;
* If anything has no NAME, the ID is used instead.&lt;br /&gt;
* Costs for a portal are 1 by default; forbidden connections have infinite cost.&lt;br /&gt;
* Rooms that are portals have no destinations and no inner rooms.&lt;br /&gt;
* Colors currently are not saved by the cad and are not read by the bci gui.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica. Da notare che le librerie usate sono SDL.h e SDL_image.h (quest'ultima è stata introdotta al momento della creazione delle stanze da illuminare e non nella precedente versione con i quadrati che si illuminano in modo sincrono)&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dovrà essere lo stesso che utilizzerà anche il pianificatore. Eventualmente il metodo può essere generalizzabile per una qualsiasi mappa caricata.&lt;br /&gt;
&lt;br /&gt;
* '''FATTO''' (disponibile su airBAT)&lt;br /&gt;
- estensione della precedente interfaccia grafica, realizzata utilizzando le librerie SDL_gfx. In questo modo è stato possibile &amp;quot;esternalizzare&amp;quot; il disegno delle primitive geometriche, rendendo più semplice l'individuazione dei poligoni di illuminazione delle varie stanze a partire dagli spigoli delle stanze stesse.&lt;br /&gt;
&lt;br /&gt;
=== Terzo incontro (09/04/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Il presente incontro è stato interamente dedicato alla discussione e formalizzazione di uno schema comune di descrizione delle mappe. Il modello (la cui descrizione è visibile nella sezione 'Map representation') verrà utilizzato sia da coloro che realizzeranno l'interfaccia grafica, sia da coloro che dovranno migliorare il pianificatore attualmente funzionante sulla carrozzina. &lt;br /&gt;
&lt;br /&gt;
* Si è deciso di utilizzare un modello basato sul linguaggio XML, grazie alle sue caratteristiche di flessibilità e semplicità.&lt;br /&gt;
&lt;br /&gt;
* Per quello che riguarda la GUI, alcune parti (scelta della zona, del piano...) saranno realizzate mediante l'illuminazione di scritte, mentre altre parti (scegliere la singola stanza o la singola location all'interno della stanza) mediante l'illuminazione della mappa vera e propria.&lt;br /&gt;
&lt;br /&gt;
* '''SVILUPPI FUTURI'''&lt;br /&gt;
- utilizzo di &amp;quot;portali&amp;quot; per il passaggio diretto tra luoghi diversi, anche a diversi livelli dell'albero XML. Al momento attuale, ci si potrà spostare di un solo livello per volta.&lt;br /&gt;
&lt;br /&gt;
- studio dei diversi colori da utilizzare nell'interfaccia grafica&lt;br /&gt;
&lt;br /&gt;
* '''DA FARE'''&lt;br /&gt;
- realizzazione di un parser xml mediante l'utilizzo delle librerie libxml2&lt;br /&gt;
&lt;br /&gt;
- realizzazione delle parti riguardanti le zone e i piani (illuminazione di scritte) e le locations.&lt;br /&gt;
&lt;br /&gt;
- generalizzazione del codice finora implementato&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5544</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5544"/>
				<updated>2009-03-20T07:52:38Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* Feasibility check: [http://www.wxwidgets.org/ wxWidgets] and [http://maiaproject.sourceforge.net/ OpenMaia].  Check if using OpenMaia with wxWidgets is okay for the stimulation synchronization.  The timing difference between the highlighting of a choice and the switching of the synchronization square should be no more than the duration of a screen frame (about 16 ms for a 60 Hz screen).&lt;br /&gt;
&lt;br /&gt;
* Writing of a communication protocol between the BCI2000 developed in the project [[Online P300 and ErrP recognition with BCI2000]].  To be done together with [[User:AndreaSgarlata|Andrea Sgarlata]].&lt;br /&gt;
&lt;br /&gt;
* Development of a storage system to store information about the layout and the action of the interfaces; an extension of the XML format used by OpenMaia to describe keyboards should be possible.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;br /&gt;
&lt;br /&gt;
* FATTO (disponibile su airBAT)&lt;br /&gt;
- interfaccia grafica con due quadrati che si illuminano in modo sincronizzato tra loro.&lt;br /&gt;
&lt;br /&gt;
- interfaccia grafica con una semplice mappa, i cui ambienti si illuminano in maniera randomica.&lt;br /&gt;
&lt;br /&gt;
=== Secondo incontro (19/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* I sorgenti realizzati sono stati provati sulla carrozzina e funzionano correttamente. Il monitor non deve essere settato ad un livello troppo luminoso, altrimenti i fotodiodi vanno in saturazione.&lt;br /&gt;
&lt;br /&gt;
* Problema delle mappe: bisogna decidere come descrivere i vari ambienti della mappa. L'idea è quella di usare dei punti e delle rette. Inoltre il metodo che verrà deciso per la GUI dorà essere lo stesso che utilizzerà anche il pianificatore.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5427</id>
		<title>Talk:Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Talk:Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5427"/>
				<updated>2009-03-07T17:10:35Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
The interface is used mainly to drive the [[LURCH - The autonomous wheelchair|Lurch wheelchair]].  It has different screens, corresponding to the different rooms or different environments where the wheelchair can move.  The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks.  The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as [http://en.wikipedia.org/wiki/Accessibility accessible] as possible.  It can be driven by a BCI, used with the touch screen or with the keyboard.  The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* Feasibility check: [http://www.wxwidgets.org/ wxWidgets] and [http://maiaproject.sourceforge.net/ OpenMaia].  Check if using OpenMaia with wxWidgets is okay for the stimulation synchronization.  The timing difference between the highlighting of a choice and the switching of the synchronization square should be no more than the duration of a screen frame (about 16 ms for a 60 Hz screen).&lt;br /&gt;
&lt;br /&gt;
* Writing of a communication protocol between the BCI2000 developed in the project [[Online P300 and ErrP recognition with BCI2000]].  To be done together with [[User:AndreaSgarlata|Andrea Sgarlata]].&lt;br /&gt;
&lt;br /&gt;
* Development of a storage system to store information about the layout and the action of the interfaces; an extension of the XML format used by OpenMaia to describe keyboards should be possible.&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol Requirements==&lt;br /&gt;
&lt;br /&gt;
* Cross-platform (at least Linux and Windows)&lt;br /&gt;
* Based on the IP protocol&lt;br /&gt;
* Asynchronous (as much as possible), so as not to block remote processes&lt;br /&gt;
* Preferably, the protocol should be in ASCII, with fixed-width fields (the number of fields is variable, by necessity).&lt;br /&gt;
&lt;br /&gt;
===To Do===&lt;br /&gt;
&lt;br /&gt;
* List of the pieces of information to be transferred between the application and the GUI&lt;br /&gt;
&lt;br /&gt;
==Communication Protocol==&lt;br /&gt;
===UML Sequence Diagram===&lt;br /&gt;
====Diagram====&lt;br /&gt;
&lt;br /&gt;
[[Image:ComunicationProtocol.jpg]]&lt;br /&gt;
&lt;br /&gt;
====Comments about the diagram====&lt;br /&gt;
Structure of MessageA:&lt;br /&gt;
* Number of repetitions: number of flashings&lt;br /&gt;
* Number of stimulations: number of flashings in one repetition&lt;br /&gt;
* List of the stimulations: list of the possible stimulations with its type&lt;br /&gt;
* Number of types&lt;br /&gt;
* Stimulations sequence: it includes all the repetitions&lt;br /&gt;
&lt;br /&gt;
Each stimulation must hav associated a type (e.g Icon, Row-Column)&lt;br /&gt;
&lt;br /&gt;
Structure of SelectionA:&lt;br /&gt;
* For each number of stimulation types you have a equal number of ids (e.g for Icon it will be used 1 id, for Row-Column 2 ids)&lt;br /&gt;
&lt;br /&gt;
Graphic example of id:&lt;br /&gt;
&lt;br /&gt;
[[Image:IdExample.jpg]]&lt;br /&gt;
&lt;br /&gt;
It will be also an end asynchronous message, that brings the BCI in pause, and it closes the graphic interface.&lt;br /&gt;
&lt;br /&gt;
If the syncrony will be lost there's a Reset Message that restarts from the calibration. It will be activated when the number of the classifications is different from the number of the stimulations on the screen&lt;br /&gt;
&lt;br /&gt;
== Implementation of GUI ==&lt;br /&gt;
=== Primo incontro (04/03/2009) ===&lt;br /&gt;
&lt;br /&gt;
* Attualmente sulla carrozzella è installata una GUI molto semplice, che lavora all'interno del sistema BCI2000. L'idea è quella di creare una interfaccia asincrona che dovrà interagire con il sistema BCI2000 già realizzato mediante un socket TCP.&lt;br /&gt;
&lt;br /&gt;
* Ci sono diverse possibilità per implementare la GUI:&lt;br /&gt;
&lt;br /&gt;
0) Stimoliamo le singole location presenti all'interno della mappa: il problema è che può diventare pesante, e che può essere difficile dal punto di vista cognitivo per l'utente.&lt;br /&gt;
&lt;br /&gt;
1) Per prima cosa stimoliamo i diversi locali, e poi stimoliamo le location appartenenti al singolo locale selezionato (in realtà dovremo continuare a stimolare anche gli altri locali, nel caso in cui l'utente volesse uscire dalla stanza!)&lt;br /&gt;
Le singole location possono essere stimolate in diversi modi: per gruppi, singolarmente, tramite una griglia.&lt;br /&gt;
&lt;br /&gt;
2) Dividiamo la piantina in celle e poi le stimoliamo singolarmente. Questo approccio può essere problematico dal punto di vista della pianificazione del percorso: come fare se la location non è direttamente raggiungibile dall'interno della singola cella, per esempio a causa della presenza di un muro?&lt;br /&gt;
&lt;br /&gt;
L'approccio 1) è decisamente il più naturale. Si può comunque pensare di sviluppare tutti i metodi e poi confrontarli.&lt;br /&gt;
&lt;br /&gt;
* Le caratteristiche della GUI devono essere:&lt;br /&gt;
- menu gerarchico per la navigazione&lt;br /&gt;
&lt;br /&gt;
- file di configurazione (direttamente lo stesso file del pianificatore) deve definire la piantina, le stanze, le location, (gruppi di location?).&lt;br /&gt;
&lt;br /&gt;
* Il linguaggio in cui sviluppare la GUI può essere&lt;br /&gt;
- MAIA forte rischio di avere problemi di sincronizzazione!&lt;br /&gt;
&lt;br /&gt;
- SDL su C++. Optiamo per questa scelta, che presenta meno rischi.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5375</id>
		<title>Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5375"/>
				<updated>2009-03-06T10:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Part 1: project profile''' ==&lt;br /&gt;
=== Project name ===&lt;br /&gt;
Graphical user interface for an autonomous wheelchair&lt;br /&gt;
&lt;br /&gt;
=== Project short description ===&lt;br /&gt;
&lt;br /&gt;
This project is aimed at design and developing a graphic interface that allows the user on a weelchair (using the BCI system) to express a thought given a table with the letters of alphabet or to express a place to reach given a map.&lt;br /&gt;
&lt;br /&gt;
=== Dates ===&lt;br /&gt;
Start date: 04/03/2009&lt;br /&gt;
&lt;br /&gt;
End date: &lt;br /&gt;
&lt;br /&gt;
=== People involved ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Project head(s) =====&lt;br /&gt;
M. Matteucci [[User:MatteoMatteucci]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Other Politecnico di Milano people =====&lt;br /&gt;
B. Dal Seno [[User:BernardoDalSeno]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Students worked on the project in the past=====&lt;br /&gt;
R. Massimini [[User:RobertoMassimini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Students currently working on the project =====&lt;br /&gt;
A. Tripodi [[User:AntonioTripodi]]&lt;br /&gt;
&lt;br /&gt;
E. Ciceri [[User:EleonoraCiceri]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Part 2: project description''' ==&lt;br /&gt;
The interface is used mainly to drive the Lurch wheelchair. It has different screens, corresponding to the different rooms or different environments where the wheelchair can move. The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks. The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as accessible as possible. It can be driven by a BCI, used with the touch screen or with the keyboard. The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5374</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5374"/>
				<updated>2009-03-06T10:49:38Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|photo=tre.jpg|200px|thumb|center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2006-2009'': Corso di laurea triennale in ingegneria informatica presso il Polo Regionale di Como del Politecnico di Milano&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''2009'': Tesista presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (all'interno del progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5373</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5373"/>
				<updated>2009-03-06T09:16:08Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|photo=tre.jpg|200px|thumb|center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2006-2009'': Corso di laurea triennale in ingegneria informatica presso il Polo Regionale di Como del Politecnico di Milano&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''2009'': Tesista (tesi triennale) presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5372</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5372"/>
				<updated>2009-03-06T09:14:55Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|photo=tre.jpg|200px|thumb|center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''a.s. 2005/2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2006-2009'': Corso di laurea triennale in ingegneria informatica presso il Polo Regionale di Como del Politecnico di Milano&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''a.a. 2008/2009'': Tesista (tesi triennale) presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5371</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5371"/>
				<updated>2009-03-06T09:14:28Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|photo=tre.jpg|200px|thumb|center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''a.s. 2005/2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''2006-2009'': Corso di laurea triennale in ingegneria informatica presso il Polo Regionale di Como del Politecnico di Milano&lt;br /&gt;
&lt;br /&gt;
''a.a. 2008/2009'': Tesista (tesi triennale) presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5370</id>
		<title>Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5370"/>
				<updated>2009-03-06T09:09:21Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Part 1: project profile''' ==&lt;br /&gt;
=== Project name ===&lt;br /&gt;
Graphical user interface for an autonomous wheelchair&lt;br /&gt;
&lt;br /&gt;
=== Project short description ===&lt;br /&gt;
&lt;br /&gt;
This project is aimed at design and developing a graphic interface that allows the user on a weelchair (using the BCI system) to express a thought given a table with the letters of alphabet or to express a place to reach given a map.&lt;br /&gt;
&lt;br /&gt;
=== Dates ===&lt;br /&gt;
Start date: 04/03/2009&lt;br /&gt;
&lt;br /&gt;
End date: &lt;br /&gt;
&lt;br /&gt;
=== People involved ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Project head(s) =====&lt;br /&gt;
M. Matteucci [[User:MatteoMatteucci]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Other Politecnico di Milano people =====&lt;br /&gt;
B. Dal Seno [[User:BernardoDalSeno]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Students worked on the project =====&lt;br /&gt;
R. Massimini [[User:RobertoMassimini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Students currently working on the project =====&lt;br /&gt;
A. Tripodi [[User:AntonioTripodi]]&lt;br /&gt;
&lt;br /&gt;
E. Ciceri [[User:EleonoraCiceri]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Part 2: project description''' ==&lt;br /&gt;
The interface is used mainly to drive the Lurch wheelchair. It has different screens, corresponding to the different rooms or different environments where the wheelchair can move. The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks. The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as accessible as possible. It can be driven by a BCI, used with the touch screen or with the keyboard. The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5369</id>
		<title>Graphical user interface for an autonomous wheelchair</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=Graphical_user_interface_for_an_autonomous_wheelchair&amp;diff=5369"/>
				<updated>2009-03-06T09:08:39Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Part 1: project profile''' ==&lt;br /&gt;
=== Project name ===&lt;br /&gt;
Graphical user interface for an autonomous wheelchair&lt;br /&gt;
&lt;br /&gt;
=== Project short description ===&lt;br /&gt;
&lt;br /&gt;
This project is aimed at design and developing a graphic interface that allows the user on a weelchair (using the BCI system) to express a thought given a table with the letters of alphabet or to express a place to reach given a map.&lt;br /&gt;
&lt;br /&gt;
=== Dates ===&lt;br /&gt;
Start date: &lt;br /&gt;
&lt;br /&gt;
End date: &lt;br /&gt;
&lt;br /&gt;
=== People involved ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Project head(s) =====&lt;br /&gt;
M. Matteucci [[User:MatteoMatteucci]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Other Politecnico di Milano people =====&lt;br /&gt;
B. Dal Seno [[User:BernardoDalSeno]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Students worked on the project =====&lt;br /&gt;
R. Massimini [[User:RobertoMassimini]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Students currently working on the project =====&lt;br /&gt;
A. Tripodi [[User:AntonioTripodi]]&lt;br /&gt;
&lt;br /&gt;
E. Ciceri [[User:EleonoraCiceri]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Part 2: project description''' ==&lt;br /&gt;
The interface is used mainly to drive the Lurch wheelchair. It has different screens, corresponding to the different rooms or different environments where the wheelchair can move. The screens are organized hierarchically: a main screen permits to choose whether to drive the wheelchair or perform other tasks. The screens used for driving the wheelchair show a map of the environment, with different levels of details; e.g., a map might show just the rooms of a house, and then another map might show the living room with the furniture and ‘interesting’ positions (like near the table, in front of the TV, beside the window...).&lt;br /&gt;
&lt;br /&gt;
The interface should be as accessible as possible. It can be driven by a BCI, used with the touch screen or with the keyboard. The BCI is based on the P300 and ErrP potentials; so the interface should highlight the possible choices on at a time (in orthogonal groups if the choices are numerous), and show the choice detected by the BCI for ErrP-based confirmation.&lt;br /&gt;
&lt;br /&gt;
Maybe the screen should be updated while the wheelchair navigates; e.g., when the wheelchair enter into the kitchen, the GUI shows the map of the kitchen.&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5368</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5368"/>
				<updated>2009-03-06T09:04:57Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|photo=tre.jpg|200px|thumb|center&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''a.s. 2005/2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''a.a. 2008/2009'': Tesista (tesi triennale) presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5367</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5367"/>
				<updated>2009-03-06T09:03:07Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|[[Image:tre.jpg]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''a.s. 2005/2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''a.a. 2008/2009'': Tesista (tesi triennale) presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=File:Tre.jpg&amp;diff=5366</id>
		<title>File:Tre.jpg</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=File:Tre.jpg&amp;diff=5366"/>
				<updated>2009-03-06T08:58:40Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	<entry>
		<id>https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5365</id>
		<title>User:AntonioTripodi</title>
		<link rel="alternate" type="text/html" href="https://airwiki.elet.polimi.it/index.php?title=User:AntonioTripodi&amp;diff=5365"/>
				<updated>2009-03-06T08:56:28Z</updated>
		
		<summary type="html">&lt;p&gt;AntonioTripodi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{SMWUser&lt;br /&gt;
|firstname=Antonio&lt;br /&gt;
|lastname=Tripodi&lt;br /&gt;
|email=antonio1.tripodi(at)mail.polimi(dot)it&lt;br /&gt;
|advisor=MatteoMatteucci&lt;br /&gt;
|projectpage=Graphical user interface for an autonomous wheelchair &lt;br /&gt;
|[[Image:Antonio_Tripodi.jpg]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Antonio Tripodi'''&lt;br /&gt;
&lt;br /&gt;
Data di nascita: 05/06/1987&lt;br /&gt;
&lt;br /&gt;
Luogo di nascita: Milano&lt;br /&gt;
&lt;br /&gt;
'''Percorso di studi'''&lt;br /&gt;
&lt;br /&gt;
''a.s. 2005/2006'': Diploma di maturità classica conseguito presso il Liceo Ginnasio &amp;quot;S.M.Legnani&amp;quot; - Saronno (VA)&lt;br /&gt;
Votazione: 100/100&lt;br /&gt;
&lt;br /&gt;
''2008'': Vincitore della borsa di studio &amp;quot;Bracco Imaging S.p.A.&amp;quot; - sezione lauree scientifiche&lt;br /&gt;
&lt;br /&gt;
''a.a. 2008/2009'': Tesista (tesi triennale) presso il laboratorio AIRLab del Politecnico di Milano con un progetto relativo alla realizzazione di una interfaccia grafica basata sulla stimolazione di potenziali P300 (progetto LURCH)&lt;/div&gt;</summary>
		<author><name>AntonioTripodi</name></author>	</entry>

	</feed>