X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=boards%2Fsam3x-ek%2Fexamples%2Fsam3x-ek_http_server%2Fmain.c;h=d8087c65b63c4a974d4aaaff27388b2f2f98fd84;hb=f3ce42cfd746ed096afcf3d1ee287dfddba3bdef;hp=276265a66418f804a839fefa8766cd32298a4df3;hpb=a40850b888e38a4ff88138639a22bfd373b8af81;p=bertos.git diff --git a/boards/sam3x-ek/examples/sam3x-ek_http_server/main.c b/boards/sam3x-ek/examples/sam3x-ek_http_server/main.c index 276265a6..d8087c65 100644 --- a/boards/sam3x-ek/examples/sam3x-ek_http_server/main.c +++ b/boards/sam3x-ek/examples/sam3x-ek_http_server/main.c @@ -26,16 +26,21 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2010,2011 Develer S.r.l. (http://www.develer.com/) + * Copyright 2011 Develer S.r.l. (http://www.develer.com/) * * --> * * \author Andrea Righi + * \author Daniele Basile * - * \brief lwIP TCP/IP echo server listening on port 80. + * \brief Simple Http server. + * + * This simple web server read the site's pages from SD card, and manage + * the cases where SD is not present or page not found, using embedded pages. + * Quering from browser the /status page, the server return a json dictionary where are store + * some board status info, like board temperature, up-time, etc. */ -#include "bertos.c" #include "hw/hw_sd.h" #include "hw/hw_adc.h" @@ -55,6 +60,8 @@ #include #include +#include + #include #include @@ -65,6 +72,8 @@ #include +#include + #include #include @@ -72,11 +81,6 @@ static struct ip_addr ipaddr, netmask, gw; static struct netif netif; -// SD fat filesystem context -static Sd sd; -static FATFS fs; -static FatFile in_file; - typedef struct BoardStatus { char local_ip[sizeof("123.123.123.123")]; @@ -88,6 +92,7 @@ typedef struct BoardStatus static BoardStatus status; + static void init(void) { /* Enable all the interrupts */ @@ -130,55 +135,55 @@ static NORETURN void status_process(void) } } -static void get_fileName(char *revc_buf, char *name, size_t len) +#define IP_ADDR_TO_INT_TUPLE(addr) \ + (int)((addr) >> 0 & 0xff), \ + (int)((addr) >> 8 & 0xff), \ + (int)((addr) >> 16 & 0xff), \ + (int)((addr) >> 24 & 0xff) + + +static uint8_t tx_buf[1024]; + +static int cgi_status(char *revc_buf, struct netconn *client) { - char *p = strstr(revc_buf, "GET"); - if (p) - { - //skip the "/" in get string request - p += sizeof("GET") + 1; - for (size_t i = 0; *p != ' '; i++,p++) - { - if (i > len) - break; - name[i] = *p; - } - } -} + (void)revc_buf; -static const char http_html_hdr_200[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n"; -static const char http_html_hdr_404[] = "HTTP/1.1 404 Not Found\r\nContent-type: text/html\r\n\r\n"; + //Update board status. + sprintf(status.last_connected_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(client->pcb.ip->remote_ip.addr)); + sprintf(status.local_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(client->pcb.ip->local_ip.addr)); + sprintf((char *)tx_buf, "[ %s, %s, %d.%d, %ld, %d ]", status.local_ip, status.last_connected_ip, + status.internal_temp / 10, status.internal_temp % 10, + status.up_time, status.tot_req); -static const char http_file_not_found[] = "\ - \ - \ -404 Not Found

404 Not Found

\ -

The requested URL was not found on this server.


\ -
BeRTOS simple HTTP server
"; + status.tot_req++; + http_sendOk(client); + netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY); + return 0; +} -static const char http_sd_not_present[] = " \ - \ - \ -BeRTOS simple HTTP Server \ -

BeRTOS simple HTTP Server

Simple Http server, the site's pages are stored on SD card, check it if is present.


\ -www.BeRTOS.org \ -"; +static int cgi_logo(char *revc_buf, struct netconn *client) +{ + (void)revc_buf; -static uint8_t tx_buf[2048]; + http_sendOk(client); + netconn_write(client, bertos_logo_jpg, bertos_logo_jpg_len, NETCONN_NOCOPY); + return 0; +} -#define IP_ADDR_TO_INT_TUPLE(addr) \ - (int)((addr) >> 0 & 0xff), \ - (int)((addr) >> 8 & 0xff), \ - (int)((addr) >> 16 & 0xff), \ - (int)((addr) >> 24 & 0xff) + +static HttpCGI cgi_table[] = +{ + { "status", cgi_status }, + { "bertos_logo_jpg.jpg", cgi_logo }, + { NULL, NULL } +}; -static char file_name[80]; int main(void) { struct netconn *server; - FRESULT result; + /* Hardware initialization */ init(); @@ -196,104 +201,6 @@ int main(void) while (1) { - struct netconn *client; - struct netbuf *rx_buf_conn; - char *rx_buf; - u16_t len; - - client = netconn_accept(server); - if (!client) - continue; - - //Update board status. - sprintf(status.local_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(client->pcb.ip->remote_ip.addr)); - sprintf(status.last_connected_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(client->pcb.ip->local_ip.addr)); - status.tot_req++; - - rx_buf_conn = netconn_recv(client); - if (rx_buf_conn) - { - netbuf_data(rx_buf_conn, (void **)&rx_buf, &len); - if (rx_buf) - { - memset(file_name, 0, sizeof(file_name)); - memset(tx_buf, 0, sizeof(tx_buf)); - - get_fileName(rx_buf, file_name, sizeof(file_name)); - - kprintf("%s\n", file_name); - if (strlen(file_name) == 0) - strcpy(file_name, "index.htm"); - - if (!strcmp("bertos_jpg.jpg", file_name)) - { - netconn_write(client, bertos_jpg, sizeof(bertos_jpg), NETCONN_NOCOPY); - } - else if (!strcmp("status", file_name)) - { - sprintf((char *)tx_buf, "[ %s, %s, %d.%d, %ld, %d ]", status.local_ip, status.last_connected_ip, - status.internal_temp / 10, status.internal_temp % 10, - status.up_time, status.tot_req); - - netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY); - } - else if (SD_CARD_PRESENT()) - { - bool sd_ok = sd_init(&sd, NULL, 0); - if (sd_ok) - { - kprintf("Mount FAT filesystem.\n"); - result = f_mount(0, &fs); - if (result != FR_OK) - { - kprintf("Mounting FAT volumes error[%d]\n", result); - sd_ok = false; - f_mount(0, NULL); - } - - if (sd_ok) - { - result = fatfile_open(&in_file, file_name, FA_OPEN_EXISTING | FA_READ); - - size_t count = 0; - if (result == FR_OK) - { - kprintf("Opened file '%s' size %ld\n", file_name, in_file.fat_file.fsize); - - netconn_write(client, http_html_hdr_200, sizeof(http_html_hdr_200) - 1, NETCONN_NOCOPY); - - while (count < in_file.fat_file.fsize) - { - int len = kfile_read(&in_file.fd, tx_buf, sizeof(tx_buf)); - netconn_write(client, tx_buf, len, NETCONN_COPY); - count += len; - } - - kfile_flush(&in_file.fd); - kfile_close(&in_file.fd); - - kprintf("Sent: %d\n", count); - } - else - { - kprintf("Unable to open file: '%s' error[%d]\n", file_name, result); - netconn_write(client, http_html_hdr_404, sizeof(http_html_hdr_404) - 1, NETCONN_NOCOPY); - netconn_write(client, http_file_not_found, sizeof(http_file_not_found) - 1, NETCONN_NOCOPY); - } - } - } - f_mount(0, NULL); - kprintf("Umount FAT filesystem.\n"); - } - else - { - netconn_write(client, http_html_hdr_404, sizeof(http_html_hdr_404) - 1, NETCONN_NOCOPY); - netconn_write(client, http_sd_not_present, sizeof(http_sd_not_present), NETCONN_NOCOPY); - } - } - netconn_close(client); - netbuf_delete(rx_buf_conn); - } - netconn_delete(client); + http_server(server, cgi_table); } }