diff options
Diffstat (limited to 'Webduino/examples/Web_Image/Web_Image.ino')
-rw-r--r-- | Webduino/examples/Web_Image/Web_Image.ino | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/Webduino/examples/Web_Image/Web_Image.ino b/Webduino/examples/Web_Image/Web_Image.ino new file mode 100644 index 0000000..cafb149 --- /dev/null +++ b/Webduino/examples/Web_Image/Web_Image.ino @@ -0,0 +1,117 @@ +/* Web_Image.pde - example sketch for Webduino library */ +/* For webduino version 1.2 */ + +/* DISCLAIMER -- the Webduino server can only handle one web connection + * at a time. Because of this, loading the root page on this sketch may + * not correctly show the LED icon if the browser starts requesting that + * picture before the page has finished loading. + * + * This problem should be reduced greatly once the Ethernet library + * has been modified to do proper packet buffering. With the library + * in Arduino 15, each character is sent in its own TCP/IP packet. + * This is very inefficient and means that it takes much longer to + * send a web page than it should. When this bug is fixed, the web + * server will have sent its last data and closed the connection by + * the time the client reads the HTML, so it's ready to handle the + * image request. + */ + +#include "SPI.h" +#include "Ethernet.h" +#include "WebServer.h" + +// CHANGE THIS TO YOUR OWN UNIQUE VALUE +static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +static uint8_t ip[] = { 192, 168, 1, 210 }; + +WebServer webserver("", 80); + +/* The default page just returns HTML to show the image */ +void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) +{ + if (type == WebServer::POST) + { + // ignore POST data + server.httpFail(); + return; + } + + /* for a GET or HEAD, send the standard "it's all OK headers" */ + server.httpSuccess(); + + /* we don't output the body for a HEAD request */ + if (type == WebServer::GET) + { + /* store the HTML in program memory using the P macro */ + P(message) = + "<html><head><title>Webduino Image Example</title>" + "<body>" + "<h2>LED Image</h2>" + "<img src='led.png' width=256 height=256>" + "</body></html>"; + + server.printP(message); + } +} + +void imageCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) +{ + /* this data was taken from a PNG file that was converted to a C data structure + * by running it through the directfb-csource application. */ + P(ledData) = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x91, 0x68, + 0x36, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, + 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, + 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00, + 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, + 0x3a, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, + 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x50, 0x61, 0x69, 0x6e, 0x74, + 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x76, 0x33, 0x2e, 0x33, 0x36, 0xa9, 0xe7, 0xe2, 0x25, 0x00, 0x00, + 0x00, 0x57, 0x49, 0x44, 0x41, 0x54, 0x38, 0x4f, 0x95, 0x52, 0x5b, 0x0a, 0x00, 0x30, 0x08, 0x6a, + 0xf7, 0x3f, 0xf4, 0x1e, 0x14, 0x4d, 0x6a, 0x30, 0x8d, 0x7d, 0x0d, 0x45, 0x2d, 0x87, 0xd9, 0x34, + 0x71, 0x36, 0x41, 0x7a, 0x81, 0x76, 0x95, 0xc2, 0xec, 0x3f, 0xc7, 0x8e, 0x83, 0x72, 0x90, 0x43, + 0x11, 0x10, 0xc4, 0x12, 0x50, 0xb6, 0xc7, 0xab, 0x96, 0xd0, 0xdb, 0x5b, 0x41, 0x5c, 0x6a, 0x0b, + 0xfd, 0x57, 0x28, 0x5b, 0xc2, 0xfd, 0xb2, 0xa1, 0x33, 0x28, 0x45, 0xd0, 0xee, 0x20, 0x5c, 0x9a, + 0xaf, 0x93, 0xd6, 0xbc, 0xdb, 0x25, 0x56, 0x61, 0x01, 0x17, 0x12, 0xae, 0x53, 0x3e, 0x66, 0x32, + 0xba, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 + }; + + if (type == WebServer::POST) + { + // ignore POST data + server.httpFail(); + return; + } + + /* for a GET or HEAD, send the standard "it's all OK headers" but identify our data as a PNG file */ + server.httpSuccess("image/png"); + + /* we don't output the body for a HEAD request */ + if (type == WebServer::GET) + { + server.writeP(ledData, sizeof(ledData)); + } +} + +void setup() +{ + // setup the Ehternet library to talk to the Wiznet board + Ethernet.begin(mac, ip); + + /* register our default command (activated with the request of + * http://x.x.x.x/ */ + webserver.setDefaultCommand(&defaultCmd); + + /* register our image output command */ + webserver.addCommand("led.png", &imageCmd); + + /* start the server to wait for connections */ + webserver.begin(); +} + +void loop() +{ + // process incoming connections one at a time forever + webserver.processConnection(); +} |