FTPmicro Tutorial – Esempio pratico

Analizziamo ora un semplice esempio per il monitoraggio in tempo reale della temperatura, sfruttando il sensore a bordo di FTPMicro, e l'azionamento di due LED, tramite una pagina HTML ed una CGI.

Nell'esempio viene utilizzato AHAH (Asynchronous HTTP And HTML), il quale
ci permette di inviare richieste HTTP in modo asincrono, ovvero senza dover ricaricare la pagina.
Il file CGI che utilizzeremo (status.cgi) è molto semplice; è costituito da codice html per realizzare una tabellina, all'interno della quale verranno scritti lo stato dei LED e la temperatura di sistema.

<table class="status_table">
  <tr><th colspan="2">Temperature</th></tr>
  <tr><td>System</td><td>%00°C</td></tr>
  <tr><th colspan="2">LED Status</th></tr>
  <tr><td>LED 1</td><td>%01</td></tr>
  <tr><td>LED 2</td><td>%02</td></tr>
</table>

Come si può notare, le variabili utilizzate sono:

  • 00: la temperatura;
  • 01: il primo LED
  • 02: il secondo LED

Quindi questa pagina sarà richiesta periodicamente per conoscere lo stato del sistema.
Ora esaminiamo la pagina principale (index.htm), la quale fondamentalmente conterrà due pulsanti per modificare lo stato dei LED, ed ingloberà, grazie ad AHAH, la pagina CGI.

<html>
 <head>
   <title>FTPMicro: Temperature Example</title>
   <script type="text/javascript" src="/ahah.js"></script>
   <script type="text/javascript">
     function refresh() {
	if (lo) return true;
// interrompe il caricamento se c'è già un altro caricamento in corso (causa pulsanti)
noloadAHAH('/Status.cgi','tempdiv','GET'); // richiede la pagina status.cgi e la carica nel div "tempdiv"
     }
     window.setInterval("refresh()",2000);
   </script>
   <link rel="stylesheet" type="text/css" media="all" href="/style.css" />
 </head>
 <body>
   <h1>FTPMicro</h1>
   <div class="bar">
     The world smallest WebServer and FtpClient with DHCP and UDP features
   </div>
   <div id="tempdiv" class="left">
 	Loading...
   </div>
   <div class="left">
     <form>	
       <table class="status_table">
         <tr><th>LED Toggle</th></tr>
         <tr><td><input type="submit" value="LED 1" onclick="javascript:
noloadAHAH('/Status.cgi?t=1','tempdiv','GET'); return false;"></td></tr>
         <tr><td><input type="submit" value="LED 2" onclick="javascript:
noloadAHAH('/Status.cgi?t=2','tempdiv','GET'); return false;"></td></tr>
       </table>
     </form>
   </div>
 </body>
</html>

Come si può notare, la pagina è piuttosto semplice; la cosa che potrebbe risultare un po' criptica, però, è l'utilizzo di AHAH.

Innanzitutto, nell'header della pagina, si trova un breve script Javascript, che attraverso la funzione setInterval, ci permette di visualizzare lo stato ad intervalli regolari richiamando la pagina CGI. Quest'ultima verrà caricata all'interno del div che ha come id "tempdiv".
L'altra sezione di rilievo, è quella che riguarda i pulsanti. Anch'essi ricorrono ad AHAH per inviare comandi senza dover ricaricare la pagina.
In questo esempio, viene utilizzato il parametro "t" il cui valore corrisponde al LED su cui agire, quindi /Status.cgi?t=1 sarà il comando da inviare per il primo LED, e /Status.cgi?t=2 per il secondo. Dopo l'esecuzione del comando verrà restituita la pagina richiesta (status.cgi) che verrà sempre caricata all'interno del suo div.
Nell'esempio viene anche utilizzato un file css, ma esso serve soltanto per definire lo stile della pagina.

A questo punto, analizziamo l'implementazione dei metodi ProcessIO, HTTPExecCmd e HTTPGetVar; ecco il primo:

static char Temperature[8];

static void ProcessIO(void)
{
	signed long temp;

	// Start A/D conversion
	ADCON0bits.GO = 1;

	// Wait until A/D conversion is done
	while(ADCON0bits.GO);

	temp = (long)(*(WORD*)(&ADRESL)) * 322 - 50000; // conversione approssimativa...
	itoa(temp/1000, Temperature);
}

Tale metodo viene invocato ciclicamente, "appena possibile", ovvero quando lo stack non sta svolgendo le sue funzioni. In questo esempio, effettua la lettura della tensione d'uscita del sensore di temperatura, e la successiva conversione in stringa.

#define VAR_TEMPERATURE			(0x00)
#define	VAR_LED1			(0x01)
#define	VAR_LED2			(0x02)

#define CMD_LED1			(0x1)
#define CMD_LED2			(0x2)

Queste define sono utili per identificare variabili CGI e comandi.

void HTTPExecCmd(BYTE** argv, BYTE argc)
{
	if (argv[1][0] == 't') {
		switch (argv[2][0] - '0') {
			case CMD_LED1 :
				LED1_IO = !LED1_IO;
				break;
			case CMD_LED2 :
				LED2_IO = !LED2_IO;
				break;
		}
	}
}

Come visto prima, i possibili comandi che inviamo sono del tipo "status.cgi?t=x" dove x rappresenta il led a cui applicare il comando. Con questo comando, quando verrà invocato il metodo HTTPExecCmd, l'argomento argv, conterrà al primo posto la stringa "status.cgi" che rimarrà invariata; il secondo elemento sarà "t" (e ci assicureremo che sia così); il terzo conterrà il numero relativo al LED ma sottoforma di carattere ASCII, perciò dovremo convertirlo in intero, sottraendovi il carattere '0'.

WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
{
	switch (var) {
		case VAR_LED1 :
			*val = LED1_IO ? '1' : '0';
			break;
		
		case VAR_LED2 :
			*val = LED2_IO ? '1' : '0';
			break;

		case VAR_TEMPERATURE:
        		*val = Temperature[(BYTE)ref];
        		if(Temperature[(BYTE)ref] == '\0')
            			return HTTP_END_OF_VAR;
			else if(Temperature[(BYTE)++ref] == '\0' )
            			return HTTP_END_OF_VAR;
        		return ref;
		default : break;
	}
    return HTTP_END_OF_VAR;
}

Infine il metodo HTTPGetVar restituisce lo stato corrente dei LED, oppure la stringa Temperature; Nel primo caso è sufficiente assegnare a *val il carattere corrispondente allo stato del led (0 o 1), mentre nel secondo caso, trattandosi di una stringa, è necessario restituire un byte alla volta facendo riferimento al valore di ref.

Nel codice si fa riferimento alle definizioni LEDx_IO, le quali si trovano nel file Compiler.h:

	#define	LED1_IO				(LATAbits.LATA0)
	#define	LED1_TRIS			(TRISAbits.TRISA0)
	#define	LED2_IO				(LATAbits.LATA1)
	#define	LED2_TRIS			(TRISAbits.TRISA1)

In questo caso vengono utilizzati i LED legati al modulo Ethernet, perchè già presenti nella scheda, ma modificando tali definizioni si possono impiegare due pin generici.

Tutta la documentazione su FTPmicro è disponibile a questa pagina FTPmicro per Utenti Premium.
Potete realizzarlo da soli (fai-da-te) scaricando tutti i codici sorgenti (Schema elettrico realizzato con Orcad, lista parti, circuito stampato realizzato con Orcad, file gerber, codice sorgente assembler realizzato su piattaforma Microchip).

Il progetto montato e collaudato è disponibile sul nostro store --> FTPmicro

Scarica subito una copia gratis

6 Commenti

  1. Avatar photo Emanuele 14 Gennaio 2011
  2. Avatar photo cchechio 26 Giugno 2011
  3. Avatar photo Emanuele 11 Gennaio 2012
  4. Avatar photo Emanuele 10 Gennaio 2012
  5. Avatar photo trippus 16 Ottobre 2012
  6. Avatar photo Emanuele 16 Ottobre 2012

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend