Spidey Wall is the name for a physical wall lit up by multiple addressable LED strips. This program is an LPC1768 web server to control the wall from a browser.
Dependencies: EthernetInterfacePlusHostname RdWebServer mbed-rtos mbed
This project is part of a Light-Wall using addressable LED strips (WS2801). I have published a few posts on my blog about the construction of the wall and building a game to play on it (PacMan). I have also had a guest post from a friend who has set his children the task of producing some interesting animations. The original post is http://robdobson.com/2015/07/spidey-wall/
So far, however, I hadn't fully connected the physical (and electronic) wall with the web-browser creations to drive it. This project is hopefully the final link. A fast and reliable web server using REST commands to drive the 1686 LEDs in the Spidey Wall from code running in a browser (say on an iPad while you are playing a game).
The approach taken here results in the ability to control the RGB values of all 1686 LEDs at a rate of 20 frames per second.
A blog post describing the whole thing is here:
http://robdobson.com/2015/08/a-reliable-mbed-webserver/
Diff: main.cpp
- Revision:
- 3:e5ea80fae61d
- Parent:
- 2:99eb4c6e9ea4
- Child:
- 4:b521815f2657
--- a/main.cpp Sat Aug 29 05:33:30 2015 +0000 +++ b/main.cpp Mon Aug 31 09:03:15 2015 +0000 @@ -180,11 +180,15 @@ // Get message payload int cmdLen = RdWebServer::getPayloadLengthFromMsg(msgBuf); unsigned char* cmdBuf = RdWebServer::getPayloadDataFromMsg(msgBuf); - pc.printf("Command Payload Len %d\r\n", cmdLen); - - // Process command - char* respStr = ""; - respStr = drawingManager.start(cmdBuf, cmdLen); + + // Check if the command length is 0 - in this case respond ok as it might be a + // pre-flight check on a Cross Domain request - https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS + char* respStr = "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Methods: POST, GET, OPTIONS\r\nAccess-Control-Allow-Headers:accept, content-type\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\n\r\n"; + if (cmdLen != 0) + { + // Process command + drawingManager.start(cmdBuf, cmdLen); + } return respStr; } @@ -220,7 +224,6 @@ { printf("LightWall - Configured for "); // Check for a config file on the local file system - strcpy(systemName, "Spidey"); LocalFileSystem local("local"); FILE* fp = fopen("/local/lights.txt", "r"); if (fp != NULL) @@ -257,17 +260,27 @@ mbed_mac_address(macAddr); pc.printf("Ethernet MAC address: %02x:%02x:%02x:%02x:%02x:%02x\r\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]); pc.printf("Connecting to ethernet ...\r\n"); + + // Init ethernet EthernetInterface::init(); - EthernetInterface::connect(); - pc.printf("IP Address: %s\r\n", EthernetInterface::getIPAddress()); - // Web Server - Thread httpServer(&http_thread, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 3)); + // Using code described here https://developer.mbed.org/questions/1602/How-to-set-the-TCPIP-stack-s-hostname-pr/ + // to setName on the ethernet interface + EthernetInterface::setName(systemName); - // Forever + // Connect ethernet + EthernetInterface::connect(); + pc.printf("IP Address: %s HostName %s\r\n", EthernetInterface::getIPAddress(), EthernetInterface::getName()); + + // Web Server used to run in a thread - but I've found this slows performance a lot as described here: + // http://robdobson.com/2015/08/a-reliable-mbed-webserver/ + // Fortunately it doesn't matter as the LED code is all interrupt driven + // This is the previous code... + // Thread httpServer(&http_thread, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 3)); + http_thread(""); + + // Forever - actually it won't even get here as the server has a forever loop in it too while(true) { - // Service drawing manager - drawingManager.service(); } }