Add [11_m644p_WIZNET_HTTPServer_FLASH_pages] prj

This commit is contained in:
maxxir_w
2019-01-18 14:28:29 +04:00
parent 8c5f9de17c
commit 4c8449a175
36 changed files with 14688 additions and 0 deletions

View File

@@ -0,0 +1,225 @@
#include <stdio.h>
#include "loopback.h"
#include "socket.h"
#include "wizchip_conf.h"
#if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK
int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
#ifdef _LOOPBACK_DEBUG_
uint8_t destip[4];
uint16_t destport;
#endif
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
#ifdef _LOOPBACK_DEBUG_
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);
printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
setSn_IR(sn,Sn_IR_CON);
}
if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recv(sn, buf, size);
if(ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
size = (uint16_t) ret;
sentsize = 0;
while(size != sentsize)
{
ret = send(sn, buf+sentsize, size-sentsize);
if(ret < 0)
{
close(sn);
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
break;
case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
//printf("%d:CloseWait\r\n",sn);
#endif
if((ret = disconnect(sn)) != SOCK_OK) return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Socket Closed\r\n", sn);
#endif
break;
case SOCK_INIT :
#ifdef _LOOPBACK_DEBUG_
printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);
#endif
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:TCP server loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
#ifdef _LOOPBACK_DEBUG_
//printf("%d:Socket opened\r\n",sn);
#endif
break;
default:
break;
}
return 1;
}
int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
int32_t ret; // return value for SOCK_ERRORs
uint16_t size = 0, sentsize=0;
// Destination (TCP Server) IP info (will be connected)
// >> loopback_tcpc() function parameter
// >> Ex)
// uint8_t destip[4] = {192, 168, 0, 214};
// uint16_t destport = 5000;
// Port number for TCP client (will be increased)
static uint16_t any_port = 50000;
// Socket Status Transitions
// Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON) // Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
{
#ifdef _LOOPBACK_DEBUG_
printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
setSn_IR(sn, Sn_IR_CON); // this interrupt should be write the bit cleared to '1'
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Data Transaction Parts; Handle the [data receive and send] process
//////////////////////////////////////////////////////////////////////////////////////////////
if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
size = (uint16_t) ret;
sentsize = 0;
// Data sentsize control
while(size != sentsize)
{
ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
if(ret < 0) // Send Error occurred (sent data length < 0)
{
close(sn); // socket close
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
break;
case SOCK_CLOSE_WAIT :
#ifdef _LOOPBACK_DEBUG_
//printf("%d:CloseWait\r\n",sn);
#endif
if((ret=disconnect(sn)) != SOCK_OK) return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Socket Closed\r\n", sn);
#endif
break;
case SOCK_INIT :
#ifdef _LOOPBACK_DEBUG_
printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret; // Try to TCP connect to the TCP server (destination)
break;
case SOCK_CLOSED:
close(sn);
if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){
if(any_port == 0xffff) any_port = 50000;
return ret; // TCP socket open with 'any_port' port number
}
#ifdef _LOOPBACK_DEBUG_
//printf("%d:TCP client loopback start\r\n",sn);
//printf("%d:Socket opened\r\n",sn);
#endif
break;
default:
break;
}
return 1;
}
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size, sentsize;
uint8_t destip[4];
uint16_t destport;
switch(getSn_SR(sn))
{
case SOCK_UDP :
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
if(ret <= 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
return ret;
}
size = (uint16_t) ret;
sentsize = 0;
while(sentsize != size)
{
ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
if(ret < 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:UDP loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
#endif
break;
default :
break;
}
return 1;
}
#endif

View File

@@ -0,0 +1,38 @@
#ifndef _LOOPBACK_H_
#define _LOOPBACK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
/* Loopback test debug message printout enable */
#define _LOOPBACK_DEBUG_
/* DATA_BUF_SIZE define for Loopback example */
#ifndef DATA_BUF_SIZE
#define DATA_BUF_SIZE 2048
#endif
/************************/
/* Select LOOPBACK_MODE */
/************************/
#define LOOPBACK_MAIN_NOBLOCK 0
#define LOOPBACK_MODE LOOPBACK_MAIN_NOBLOCK
/* TCP server Loopback test example */
int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port);
/* TCP client Loopback test example */
int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport);
/* UDP Loopback test example */
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,29 @@
/*
* webpages.h
*
* Created on: 05 <20><><EFBFBD>. 2018 <20>.
* Author: maxx
*/
#ifndef WEBPAGES_H_
#define WEBPAGES_H_
#define index_page \
"<html><style>body { max-width: 480; margin: 0 auto; padding: 0 5px;}h1,h3 { text-align: center;}</style><body><span style=\"color:#0000A0\">\n"\
"<h1>W5500 Simple Web Server</h1><hr>\n"\
"<h3>AVR Mega1284p and WIZ5500</h3><hr>\n"\
"<p><form method=\"POST\">\n"\
"<strong>Uptime: <input type=\"text\" size=2 value=\"%lu\"> sec\n"\
"<p><input type=\"radio\" name=\"radio\" value=\"0\" %s>LED1 OFF\n"\
"<br><input type=\"radio\" name=\"radio\" value=\"1\" %s>LED1 ON\n"\
"<p>\n"\
"<input type=\"submit\" value=\"Update data\">\n"\
"</strong></form></span></body></html>\n"
#define page_404 \
"HTTP/1.0 404 Not Found\r\n"\
"Content-Type: text/html\r\n"\
"\r\n"\
"<!DOCTYPE HTML><html><h2>404 Not Found</h2></html>"
#endif /* WEBPAGES_H_ */

View File

@@ -0,0 +1,257 @@
#include <stdio.h>
#include <string.h>
#include "webserver_simple.h"
#include "socket.h"
#include "wizchip_conf.h"
int strindex(char *s,char *t)
{
uint16_t i,n;
n=strlen(t);
for(i=0; *(s+i); i++)
{
if (strncmp(s+i,t,n) == 0)
return i;
}
return -1;
}
void SetAutoKeepAlive(sn, time) // time > 0
{
setSn_KPALVTR(sn, time);
printf("Sn:%d - kpalvtime: %u sec\r\n",sn, 5*getSn_KPALVTR(sn));
}
int32_t websrv_simple(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size = 0;
int getidx, postidx, getidx_htm, postidx_htm;
char radiostat0[10],radiostat1[10],temp[12];
static uint32_t httpd_active_millis;
#ifdef _WEBSRV_DEBUG_
uint8_t destip[4];
uint16_t destport;
#endif
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
if(getSn_IR(sn) & Sn_IR_CON)
{
#ifdef _WEBSRV_DEBUG_
getSn_DIPR(sn, destip);
destport = getSn_DPORT(sn);
printf("%d:WEB Connected - %d.%d.%d.%d : %u\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
setSn_IR(sn,Sn_IR_CON);
//Get timetick to open socket
httpd_active_millis = millis();
}
if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.
{
if(size > WEBSRV_DATA_BUF_SIZE) size = WEBSRV_DATA_BUF_SIZE;
ret = recv(sn, buf, size);
if(ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.
//Get timetick to read data from socket
httpd_active_millis = millis();
size = (uint16_t) ret;
buf[size] = 0x0;// insert null-terminate symbol to correct parse data
#ifdef _WEBSRV_DEBUG_
PRINTF("\r\n>>HTTP REQUEST %u bytes:\r\n%s\rn\n",size, buf);
#endif
// Check the HTTP Request Header
getidx=strindex((char *)buf,"GET / ");
getidx_htm=strindex((char *)buf,"GET /index.htm");
postidx=strindex((char *)buf,"POST / ");
postidx_htm=strindex((char *)buf,"POST /index.htm");
if (getidx >= 0 || postidx >= 0 || getidx_htm >= 0 || postidx_htm >= 0)
{
#ifdef _WEBSRV_DEBUG_
PRINTF(">>Req. ROOT check!\n");
#endif
// Now check the Radio Button for POST request
if (postidx >= 0 || postidx_htm >= 0)
{
if (strindex((char *)buf,"radio=0") > 0)
{
//ledmode=0;
//PRINTF("++LED=0\r\n");
led1_low();
}
if (strindex((char *)buf,"radio=1") > 0)
{
//ledmode=1;
//PRINTF("++LED=1\r\n");
led1_high();
}
}
#ifdef _WEBSRV_DEBUG_
PRINTF(">>Req. Send!\n");
#endif
//Old method with every string fill
/*
// Create the HTTP Response Header
strcpy_P((char *)buf,PSTR("HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n"));
strcat_P((char *)buf,PSTR("<html>"\
"<style>"\
"body {"\
" max-width: 480;"\
" margin: 0 auto;"\
" padding: 0 5px;"\
"}"\
"h1,h3 {"\
" text-align: center;"\
"}"\
"</style>"\
));
strcat_P((char *)buf,PSTR("<body><span style=\"color:#0000A0\">\r\n"));
strcat_P((char *)buf,PSTR("<h1>W5500 Simple Web Server</h1><hr>\r\n"));
strcat_P((char *)buf,PSTR("<h3>AVR Mega1284p and WIZ5500</h3><hr>\r\n"));
strcat_P((char *)buf,PSTR("<p><form method=\"POST\">\r\n"));
// Now Send the HTTP Response
if (send(sn,buf,strlen((char *)buf)) <= 0) break;
// Create the HTTP Temperature Response
sprintf((char *)temp,"%lu",(millis()/1000)); // Convert temperature value to string
strcpy_P((char *)buf,PSTR("<strong>Uptime: <input type=\"text\" size=2 value=\""));
strcat((char *)buf,temp);
//strcat_P((char *)buf,PSTR("\"> <sup>O</sup>C\r\n")); // for celsius
strcat_P((char *)buf,PSTR("\"> sec\r\n")); // for seconds
if (led1_read())
{
strcpy(radiostat0,"");
strcpy_P(radiostat1,PSTR("checked"));
}
else
{
strcpy_P(radiostat0,PSTR("checked"));
strcpy(radiostat1,"");
}
// Create the HTTP Radio Button 0 Response
strcat_P((char *)buf,PSTR("<p><input type=\"radio\" name=\"radio\" value=\"0\" "));
strcat((char *)buf,radiostat0);
strcat_P((char *)buf,PSTR(">LED1 OFF\r\n"));
strcat_P((char *)buf,PSTR("<br><input type=\"radio\" name=\"radio\" value=\"1\" "));
strcat((char *)buf,radiostat1);
strcat_P((char *)buf,PSTR(">LED1 ON\r\n"));
strcat_P((char *)buf,PSTR("<p>\r\n"));
strcat_P((char *)buf,PSTR("<input type=\"submit\" value=\"Update data\">\r\n"));
strcat_P((char *)buf,PSTR("</strong></form></span></body></html>\r\n"));
*/
//New method, send page at once, (no more then ~1500 bytes content!!)
//Prepare additional data to send
if (led1_read())
{
strcpy(radiostat0,"");
strcpy_P(radiostat1,PSTR("checked"));
}
else
{
strcpy_P(radiostat0,PSTR("checked"));
strcpy(radiostat1,"");
}
//copy page to buffer and send to http client, without additional data
//strcpy_P((char *)buf,PSTR(index_page));
//copy page to buffer and send to http client, with additional data
sprintf_P((char *)buf,PSTR(index_page), millis()/1000, radiostat0, radiostat1);
// Now Send the HTTP Remaining Response
if (send(sn,buf,strlen((char *)buf)) <= 0) break;
}
else
{
//Page not found
/*
strcpy_P((char *)buf,PSTR(\
"HTTP/1.0 404 Not Found\r\n"
"Content-Type: text/html\r\n"
"\r\n"
//"<meta http-equiv=\"refresh\" content=\"5; url=/\"> " // Redirect <20><><EFBFBD><EFBFBD><EFBFBD> 5 <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
"<!DOCTYPE HTML><html><h2>404 Not Found</h2></html>"\
));
*/
//copy page to buffer and send to http client, without additional data
strcpy_P((char *)buf,PSTR(page_404));
// Now Send the HTTP Remaining Response
if (send(sn,buf,strlen((char *)buf)) <= 0) break;
}
// Disconnect the socket
disconnect(sn);
}
else
{
//here when opened socket connection but no data received
if((millis()-httpd_active_millis) > HTTPD_OPEN_TIMEOUT)
{
//Force close socket, after 3 sec idle (To beat Chrome "persistent connection")
#ifdef _WEBSRV_DEBUG_
PRINTF("!!HTTPD timeout, Force close socket\r\n");
#endif
close(sn);
}
}
break;
/*
case SOCK_FIN_WAIT:
case SOCK_CLOSING:
case SOCK_TIME_WAIT:
case SOCK_LAST_ACK:
//case SOCK_CLOSE_WAIT:
//Force close socket
close(sn);
*/
break;
case SOCK_CLOSE_WAIT :
#ifdef _WEBSRV_DEBUG_
//printf("%d:CloseWait\r\n",sn);
#endif
if((ret = disconnect(sn)) != SOCK_OK) return ret;
#ifdef _WEBSRV_DEBUG_
printf("%d:WEB Socket Closed\r\n", sn);
#endif
break;
case SOCK_INIT :
#ifdef _WEBSRV_DEBUG_
printf("%d:Listen, WEB server, port [%d]\r\n", sn, port);
#endif
if( (ret = listen(sn)) != SOCK_OK) return ret;
break;
case SOCK_CLOSED:
#ifdef _WEBSRV_DEBUG_
//printf("%d:TCP server loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret;
//This is not helped with Chrome keep-alive sessions
//SetAutoKeepAlive(sn, 1); // set Auto keepalive 5sec(1*5) (This is for TCP IP only!)
#ifdef _WEBSRV_DEBUG_
//printf("%d:Socket opened\r\n",sn);
#endif
break;
default:
break;
}
return 1;
}

View File

@@ -0,0 +1,33 @@
#ifndef _WEBSERVER_SIMPLE_H_
#define _WEBSERVER_SIMPLE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "../../globals.h"
#include "webpages.h"
/* Loopback test debug message printout enable */
#define _WEBSRV_DEBUG_
/* DATA_BUF_SIZE define for Loopback example */
#ifndef WEBSRV_DATA_BUF_SIZE
#define WEBSRV_DATA_BUF_SIZE 2048
#endif
//Timeout (ms) to close too long opened socket (Help from freeze with work with Chrome browser (keep persistent connection on WIN7 ~ 120 sec))
#define HTTPD_OPEN_TIMEOUT 3000
/* WEB SERVER test example */
int32_t websrv_simple(uint8_t sn, uint8_t* buf, uint16_t port);
int strindex(char *s,char *t);
#ifdef __cplusplus
}
#endif
#endif //_WEBSERVER_SIMPLE_H_