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();
}
}