Web Server fai-da-te con OpenPicus-Flyport

Proprio come è stato per Arduino, credo che il successo di questo modulo sia e sarà anche dovuto all’ambiente di sviluppo software essenziale, intuitivo e alla semplicità di programmazione grazie alla disponibilità di API e funzioni già scritte e pronte per essere richiamate nel proprio codice. L’unica cosa che mi ha lasciato l’amaro in bocca è che per poterlo installare è necessario aggiornare il Framework alla versione 4.

Penso che una possibile miglioria dell’ide possa essere proprio quella di renderlo multipiattaforma e quindi cercando di implementarlo ad esempio in Java, un po’ come è stato fatto per Arduino; in quest’ultimo caso, l’IDE risulta essenziale nelle dimensioni dei file e soprattutto non c’è da preoccuparsi della compatibilità con il proprio sistema operativo.

Il wizard guidato nella configurazione dello stack TCP/IP rende tutte le impostazioni di facile attuazione senza preoccuparsi di ciò che viene scritto in background nei vari file che costituiscono il progetto complessivo. I webinar i cui i link sono riportati alla fine di questa recensione presentano in modo chiaro tutta la semplicità di utilizzo del Flyport e dell’IDE associato.

Flyport: Piccolo esempio di web server

Dal sito della OpenPicus è possibile, tra le tante cose, scaricare anche un progetto di esempio che prevede l’uso del Flyport come web server attraverso il quale è possibile monitorare lo stato degli ingressi analogici e digitali e in più si può interagire con la scheda attivando o disattivando le 5 uscite digitali. Guardando il codice html, ciò che si nota subito è che si tratta di un remake stilistico di un web server messo a disposizione dalla Microchip come esempio dimostrativo di ciò che è possibile implementare adottando il loro stack TCP/IP, quindi nulla di nuovo da questo punto di vista.

Il problema è che utilizzando nel codice i comandi Ajax e le funzioni javascript per rendere maggiormente interattiva la pagina web, se uno è completamente digiuno su questo tipo di linguaggi (e io purtroppo sono tra questi) trova anche difficile riutilizzare il codice a proprio piacimento. Allora mi sono chiesto, pur rinunciando all’aggiornamento automatico della pagina e quindi dello stato degli ingressi, è possibile realizzare una pagina web più semplice? Sul sito della Microchip ho trovato tre webinar in cui viene illustrato l’utilizzo delle variabili dinamiche e dei metodi get e post per poter inviare delle richieste al web server. Tramite le variabili dinamiche si riesce quindi a monitorare lo stato degli ingressi, mentre con il metodo get è possibile, ad esempio, dire al server quali tra le uscite devono andare alte e quali basse. Alla fine della recensione sono riportati i link per scaricare i pdf delle slide+text dei tre webinar di cui sopra.

La pagina web progettata è dunque abbastanza semplice: consta di 5 pulsanti di tipo “submit”, ognuno associato ad un metodo get, i quali premuti singolarmente effettuano il toggle della relativa uscita. in funzione dello stato dell’uscita, il pulsante relativo si colora di verde se bassa e di rosso se alta. La variazione del colore di background del tasto è effettuata attraverso l’ausilio di 5 variabili dinamiche definite ed utilizzate secondo quanto spiegato dalla Microchip. Di seguito riporto lo screenshot della pagina web così come si presenta. In allegato è riportato il codice html della pagina web.

Per quanto riguarda invece il codice da inserire nella sezione webserver dell’IDE di FlyPort, di seguito riporto la funzione C che gestisce la lettura dei dati trasferiti al web server tramite il metodo get (per maggiori informazioni rifarsi ai webinar della Microchip) e la funzione, sempre in C, per la restituzione del valore opportuno alle variabili dinamiche per la variazione del colore del pulsante in funzione dello stato della relativa uscita.

HTTP_IO_RESULT HTTPExecuteGet(void)
{
	BYTE *ptr;
	BYTE name[20];
	
	// Load the file name
	// Make sure BYTE filename[] above is large enough for your longest name
	MPFSGetFilename(curHTTP.file, name, 20);

	// If it's the LED updater file
	if(strcmppgm2ram((char*)name,(ROM char*)"index.htm") != 0)
		  return HTTP_IO_DONE;
	
		// Determine which LED to toggle
		ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"lights");
		if(ptr) // Make sure ptr is not NULL
		  {
		  switch(*ptr){
			   case '0':
					IOPut(o1,toggle);
					break;
			   case '1':
					IOPut(o2,toggle);
					break;
			   case '2':
					IOPut(o3,toggle);
					break;
			   case '3':
					IOPut(o4,toggle);
					break;
			   case '4':
					IOPut(o5,toggle);
					break;
		  }
	 } 
	 return HTTP_IO_DONE;
} 

void HTTPPrint_led(WORD num)
{
	// Determine which LED
	switch(num)
	{
		case 0:
			num = IOGet(o1);
			break;
		case 1:
			num = IOGet(o2);
			break;
		case 2:
			num = IOGet(o3);
			break;
		case 3:
			num = IOGet(o4);
			break;
		case 4:
			num = IOGet(o5);
			break;
		default:
			num = 0;
	}

	// Print the output
	TCPPutROMString(sktHTTP, (num?"red":"green"));
	return;
}

La variabile “lights” può assumere 5 possibili valori numerici, da 0 a 4. Ogni valore individua una delle possibili uscite digitali del FlyPort. La funzione HTTP_IO_RESULT HTTPExecuteGet legge il valore attribuito alla variabile “lights” tramite il metodo GET (il valore è in coda all’URL) e tramite una struttura switch-case ne fa il toggle della relative uscite. Tutto questo torna molto semplice attraverso l’utilizzo delle API di gestione delle uscite e delle funzioni messe a disposizione con lo stack TCP/IP della Microchip.

La funzione “void HTTPPrint_led(WORD num)”gestisce la restituzione di una stringa agli elementi dell’array di variabili dinamiche led(num) in funzione dello stato dell’uscita. In particolare, se ad esempio l’uscita 4 è alta, allora l’elemento di indice 3 dell’array “led” assume valore “red”, mentre nel caso contrario assume il valore “green”. Queste due stringhe definiscono il valore della proprietà “background-color” del relativo pulsante sulla pagina web.

In definitiva, premendo ad esempio il pulsante 1, la variabile “lights” assume valore 0 e questa attribuzione viene posta in coda all’URL (il metodo GET lavora proprio dietro questo principio); la funzione “HTTPExecuteGet” legge il valore 0 e fa il toggle dell’uscita “o1” tramite l’API IOPut(o1,toggle); la funzione “HTTPPrint_led” legge lo stato di o1 (in realtà lo fa su tutte le uscite ad ogni ciclo) tramite l’API IOGet(o1) e se 0 restituisce alla variabile dinamica led(0) la stringa “green”, altrimenti la stringa “red”. La stringa restituita va ad interagire con la pagina web modificando di conseguenza la proprietà background-color del pulsante button1. Questo vale per qualsiasi altro pulsante e per qualsiasi altra uscita.

Con la tecnica delle variabili dinamiche e impostando delle funzioni simili a HTTPPrint_led è possibile leggere lo stato degli ingressi (compresi quelli analogici) e restituire la lettura direttamente sulla pagina web. Seguendo le indicazioni del primo link riportato a fine recensione, implementare questa operazione di monitoraggio torna davvero facile.

Flyport - Applicazione futura

Volendo disporre di più uscite/ingressi digitali rispetto a quanto il Flyport già di suo riesce a dare, avevo pensato di riprogettare la scheda “nest” inserendo on board un I/O expander a 16 canali e gestito via SPI. Cercando tra le proposte di Microchip, ho trovato l’IC a 28 pin siglato MCP23017 che soddisfa esattamente le mie specifiche. L’IC in questione dispone inoltre di 3 pin per l’indirizzamento del device e per permettere di discriminare e gestire fino a 8 I/O expander (quindi fino a 128 canali) comunicanti sullo stesso bus. La fase di definizione dello schematico è in corso e a questa seguirà una possibile soluzione per la PCB. Nel seguito, tempo permettendo, vedrò di portare avanti questo progetto e di pubblicarne gli sviluppi su EOS.

Conclusione
Volendo tirare le somme, posso concludere che il modulo Flyport è da consigliare assolutamente a tutti coloro che intendono in poco tempo mettere su un webserver gestito a distanza tramite comunicazione WiFi. Tutto sta nel seguire la configurazione guidata per l’impostazione dello stack TCP/IP e scrivere il proprio codice attraverso l’IDE software abbinato al modulo e all’interno delle sezioni “Flyport Task” e “Webserver”. Anche se non è stato evidenziato nella recensione, il codice del Flyport è organizzato e gestito sottoforma di task dal sistema operativo FreeRTOS, che svincola il programmatore dal dover organizzare e far coesistere le varie parti del firmware. La semplicità di utilizzo e di programmazione rende dunque questo modulo ideale sia per chi non vuole perdersi nella configurazione dello stack TCP/IP (che non è poi così semplice per non addetti ai lavori) sia per chi invece saprebbe dove e come mettere le mani sul firmware ma vuole vedere funzionare, in maniera relativamente rapida, la propria applicazione, in questo caso l’interfaccia gestita via web. Come ho avuto modo di evidenziare, l’IDE è compatibile con i soli sistemi operativi windows e non è assolutamente multipiattaforma. Questo potrebbe essere l’unico punto a sfavore del sistema Flyport.

Link di riferimento:

slide+text Microchip relativi ai webinar su variabili dinamiche sui metodi Get e Post:
http://techtrain.microchip.com/webseminars/documents/TCPIP_p1_092007.pdf per le variabili dinamiche
http://techtrain.microchip.com/webseminars/documents/TCPIP_p2_092007.pdf metodo “GET”
http://techtrain.microchip.com/webseminars/documents/TCPIP_p3_092007.pdf metodo “POST”

Per maggiori informazioni e webinar sulla scheda Flyport:
http://www.openpicus.com/cms/index.php?option=com_content&view=article&id=46&Itemid=60

Per maggiori informazioni sulla scheda Nest:
http://www.openpicus.com/cms/index.php?option=com_content&view=article&id=62&Itemid=99

Altri link utili:
http://openpicus.blogspot.com/2011/03/accelerometers-jquery-and-flyport.html

Scarica subito una copia gratis

3 Commenti

  1. Avatar photo simmartin 25 Agosto 2011
  2. Avatar photo lfelicetti 25 Maggio 2011
  3. Avatar photo Emanuele 25 Maggio 2011

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend