Files
retrobsd/share/smallc/webserver.c
2014-04-09 14:27:18 +01:00

89 lines
2.3 KiB
C

/*
* Web server, written in SmallC.
*
* A simple web server that shows the value of the analog input pins.
* using an Arduino Wiznet Ethernet shield.
*
* 18 Dec 2009 created by David A. Mellis
* 4 Sep 2010 modified by Tom Igoe
* 16 Apr 2012 ported to RetroBSD by Serge Vakulenko
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/gpio.h>
#include <wiznet.h>
int client [CLIENT_SIZE];
char buf [80];
main()
{
/* Initialize the Ethernet server library
* with the IP address and port you want to use
* (port 80 is default for HTTP). */
ethernet_init ();
server_init (80);
for (;;) {
/* Listen for incoming clients. */
if (server_available (client)) {
process_request();
}
}
}
process_request()
{
int current_line_is_blank;
int c, fd, pnum, value;
/* An http request ends with a blank line. */
current_line_is_blank = 1;
/* Parse the http request. */
while (client_connected (client)) {
if (client_available (client)) {
c = client_getc (client);
/* If you've gotten to the end of the line (received
* a newline character) and the line is blank, the http
* request has ended, so you can send a reply. */
if (c == '\n' && current_line_is_blank)
break;
if (c == '\n') {
/* You're starting a new line. */
current_line_is_blank = 1;
}
else if (c != '\r') {
/* You've gotten a character on the current line. */
current_line_is_blank = 0;
}
}
}
/* Send a standard http response header. */
client_puts (client, "HTTP/1.1 200 OK\n");
client_puts (client, "Content-Type: text/html\n\n");
/* Output the value of each digital pin. */
fd = open ("/dev/porta", O_RDONLY);
if (fd < 0) {
client_puts (client, "Failed to open /dev/porta\n");
} else {
for (pnum = 0; pnum < 6; pnum++) {
value = ioctl (fd, GPIO_POLL | GPIO_PORT (pnum), 0);
sprintf (buf, "PORT%c = 0x%04x <br />\n", pnum+'A', value);
client_puts (client, buf);
}
close (fd);
}
/* Give the web browser time to receive the data. */
usleep (1000);
/* Close the connection. */
client_stop (client);
}