web server program by ft n jr

6
//Program under Microchip Stack example //Sample by FtnJR #include <SanUSB.h> //Importante utilizar a biblioteca SANUSB #fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN // Ocupa cristal 4Mhz, mudar para PLL5 para utilizar como 20Mhz. #use delay(clock=48000000) #define ON output_high #define OFF output_low #define LedG PIN_B7 //Led Verde (Green) #define LedR PIN_B6 //Led Vermelho (Red) #define LedY PIN_B4 //Led Amarelo (Yellow) #define PIN_ENC_MAC_SO PIN_C7 // Conectar com PIN MISO do ENC28J60. #define PIN_ENC_MAC_SI PIN_B0 // Conectar com PIN MOSI do ENC28J60. #define PIN_ENC_MAC_CLK PIN_B1 // Conectar com PIN SCK do ENC28J60. #define PIN_ENC_MAC_CS PIN_B3 // Conectar com PIN CS do ENC28J60. #define PIN_ENC_MAC_RST PIN_B5 // Conectar com PIN RST do ENC28J60. #define PIN_ENC_MAC_INT PIN_D2 // Conectar com PIN INT do ENC28J60. #define PIN_ENC_MAC_WOL PIN_D3 // Conectar com PIN WOL do ENC28J60. #include <usb_san_cdc.h> //Protocolos a utilizar. #define STACK_USE_MCPENC TRUE //#define STACK_USE_DHCP TRUE //Sem serviço DHCP #define STACK_USE_ARP TRUE #define STACK_USE_ICMP TRUE #define STACK_USE_TCP TRUE #include "tcpip/stacktsk.c" #define MY_HTTP_SOCKET 80 int8 HTTPSocket=INVALID_SOCKET; // Microchip VendorID, MAC: 00-04-A3-XX-XX-XX void MACAddrInit(void) { MY_MAC_BYTE1=0x00; MY_MAC_BYTE2=0x04;

Upload: leorio88

Post on 27-Dec-2015

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Web Server Program by Ft n Jr

//Program under Microchip Stack example//Sample by FtnJR

#include <SanUSB.h> //Importante utilizar a biblioteca SANUSB#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN // Ocupa cristal 4Mhz, mudar para PLL5 para utilizar como 20Mhz.#use delay(clock=48000000)

#define ON output_high#define OFF output_low

#define LedG PIN_B7 //Led Verde (Green)#define LedR PIN_B6 //Led Vermelho (Red)#define LedY PIN_B4 //Led Amarelo (Yellow)

#define PIN_ENC_MAC_SO PIN_C7 // Conectar com PIN MISO do ENC28J60.#define PIN_ENC_MAC_SI PIN_B0 // Conectar com PIN MOSI do ENC28J60. #define PIN_ENC_MAC_CLK PIN_B1 // Conectar com PIN SCK do ENC28J60. #define PIN_ENC_MAC_CS PIN_B3 // Conectar com PIN CS do ENC28J60. #define PIN_ENC_MAC_RST PIN_B5 // Conectar com PIN RST do ENC28J60. #define PIN_ENC_MAC_INT PIN_D2 // Conectar com PIN INT do ENC28J60. #define PIN_ENC_MAC_WOL PIN_D3 // Conectar com PIN WOL do ENC28J60.

#include <usb_san_cdc.h>//Protocolos a utilizar.

#define STACK_USE_MCPENC TRUE//#define STACK_USE_DHCP TRUE //Sem serviço DHCP#define STACK_USE_ARP TRUE#define STACK_USE_ICMP TRUE#define STACK_USE_TCP TRUE

#include "tcpip/stacktsk.c"

#define MY_HTTP_SOCKET 80

int8 HTTPSocket=INVALID_SOCKET;

// Microchip VendorID, MAC: 00-04-A3-XX-XX-XXvoid MACAddrInit(void){ MY_MAC_BYTE1=0x00; MY_MAC_BYTE2=0x04;

Page 2: Web Server Program by Ft n Jr

MY_MAC_BYTE3=0xA3; MY_MAC_BYTE4=0x00; MY_MAC_BYTE5=0x00; MY_MAC_BYTE6=0x01;}

void limpabuffer(){ while(usb_cdc_kbhit()) { usb_cdc_getc(); }}void IPAddrInit(void){ //IP Direto MY_IP_BYTE1=192; MY_IP_BYTE2=168; MY_IP_BYTE3=1; MY_IP_BYTE4=15;

//Porta de Enlace MY_GATE_BYTE1=192; MY_GATE_BYTE2=168; MY_GATE_BYTE3=1; MY_GATE_BYTE4=165;

//Mascara de Subred MY_MASK_BYTE1=255; MY_MASK_BYTE2=255; MY_MASK_BYTE3=255; MY_MASK_BYTE4=0; }

void HTTPPut(char c){ TCPPut(HTTPSocket, c);}

void HTTPTask(void){ static enum {HTTP_ST_CONNECT=0, HTTP_ST_WAIT_CONNECT=1, HTTP_ST_GET=2, HTTP_ST_PUT=3, HTTP_ST_DISCONNECT=4, HTTP_ST_PUT2=5} state=0; static TICKTYPE timeout_counter;

Page 3: Web Server Program by Ft n Jr

static char lc, lc2; static enum {flag_0 = 0, flag_1 = 1} flag = 0; char c; char content[400];

if (HTTPSocket==INVALID_SOCKET) state=HTTP_ST_CONNECT; else if (!TCPIsConnected(HTTPSocket)) state=HTTP_ST_WAIT_CONNECT; else if (TickGetDiff(TickGet(), timeout_counter) > TICKS_PER_SECOND*60) state=HTTP_ST_DISCONNECT;

switch(state) { case HTTP_ST_CONNECT: HTTPSocket=TCPListen(MY_HTTP_SOCKET); if (HTTPSocket!=INVALID_SOCKET) { printf(usb_cdc_putc,"\r\nHTTP: Listening"); state=HTTP_ST_WAIT_CONNECT; timeout_counter=TickGet(); } break;

case HTTP_ST_WAIT_CONNECT: timeout_counter=TickGet(); if (TCPIsConnected(HTTPSocket)) { state=HTTP_ST_GET; printf(usb_cdc_putc,"\r\nHTTP: Connected"); } break;

case HTTP_ST_GET: if(flag == 0) { if (TCPIsGetReady(HTTPSocket)) { while (TCPGet(HTTPSocket, &c)) { if ( (c=='\n') && (lc2=='\n') ) { state=HTTP_ST_PUT; printf(usb_cdc_putc,"\r\nHTTP: Got Page Request"); } lc2=lc; lc=c; } } break;

Page 4: Web Server Program by Ft n Jr

} else if(flag == 1) { if (TCPIsGetReady(HTTPSocket)) { while (TCPGet(HTTPSocket, &c)) { if ( (c=='\n') && (lc2=='\n') ) { state=HTTP_ST_PUT2; printf(usb_cdc_putc,"\r\nHTTP: Got Page Request"); } lc2=lc; lc=c; } } break; }

case HTTP_ST_PUT: if (TCPIsPutReady(HTTPSocket)) { printf(usb_cdc_putc,"\r\nHTTP: Putting Page Response"); ON(LedY); //LED ON, logo o led iniciará ligado flag = flag_1; //Flag recebe 1 //Código HTML sprintf(content,"<HTML><HEAD><TITLE>Página HTML</TITLE></HEAD><BODY><BR><input type=\"button\"value=\"Led ON\"onClick=\"history.go(0)\"><BR><BR>Led Status: <b>OFF</B><BR><BR>Projeto Interdisciplinar<BR>PIC WEBSERVER</B></BODY></HTML>"); sprintf(&content[0]+strlen(content),"</BODY></HTML>"); printf(HTTPPut, "HTTP/1.1 200 OK\r\n"); printf(HTTPPut, "Content-Type: text/html\r\n"); printf(HTTPPut, "Content-Length: %u\r\n",strlen(content)); printf(HTTPPut, "\r\n"); printf(HTTPPut, "%s", content); printf(usb_cdc_putc,"\r\nHTTP: Flushing..."); TCPFlush(HTTPSocket); printf(usb_cdc_putc,"\r\nHTTP: Flushed!"); state=HTTP_ST_GET; } break; case HTTP_ST_PUT2: if (TCPIsPutReady(HTTPSocket)) { printf(usb_cdc_putc,"\r\nHTTP: Putting Page Response"); OFF(LedY); //LED OFF flag = flag_0; //Flag recebe 0

Page 5: Web Server Program by Ft n Jr

sprintf(content,"<HTML><HEAD><TITLE>Página HTML</TITLE></HEAD><BODY><BR><input type=\"button\"value=\"Led OFF\"onClick=\"history.go(0)\"><BR><BR>Led Status: <b>ON</B><BR><BR>Projeto Interdisciplinar<BR>PIC WEBSERVER</B></BODY></HTML>"); sprintf(&content[0]+strlen(content),"</BODY></HTML>"); printf(HTTPPut, "HTTP/1.1 200 OK\r\n"); printf(HTTPPut, "Content-Type: text/html\r\n"); printf(HTTPPut, "Content-Length: %u\r\n",strlen(content)); printf(HTTPPut, "\r\n"); printf(HTTPPut, "%s", content); printf(usb_cdc_putc,"\r\nHTTP: Flushing..."); TCPFlush(HTTPSocket); printf(usb_cdc_putc,"\r\nHTTP: Flushed!"); state=HTTP_ST_GET; } break;

case HTTP_ST_DISCONNECT: if (TCPIsPutReady(HTTPSocket)) { printf(usb_cdc_putc,"\r\nHTTP: Force Disconnect"); TCPDisconnect(HTTPSocket); state=HTTP_ST_WAIT_CONNECT; } break; }}

void main(void){ ON(LedR); OFF(LedG); delay_ms(200); usb_cdc_init(); usb_init(); usb_task(); usb_wait_for_enumeration(); ON(LedR); delay_ms(1000); OFF(LedR); delay_ms(1000); ON(LedR);

Page 6: Web Server Program by Ft n Jr

delay_ms(1000); OFF(LedR); delay_ms(1000); printf(usb_cdc_putc,"USB Configurado\r\n"); MACAddrInit(); IPAddrInit(); StackInit();

printf(usb_cdc_putc,"Ethernet Configurado\r\n"); ON(LedG); OFF(LedR);

while(TRUE) { StackTask(); HTTPTask(); }}