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.
Sorgenti
Il software di FTPMicro, è disponibile qui in allegato.
I sorgenti includono tutti i file necessari a realizzare l'esempio proposto nell'articolo "Esempio Pratico".
Schema elettrico

Vai qui per vedere lo schema.
PINOUT
Repost del 9 maggio
- blog di Emanuele
- 2590 letture






Invia nuovo commento