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/ /media/uploads/Bobty/20130722_112945_img_9674_62895-1184x1579.jpg

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/

Revision:
2:99eb4c6e9ea4
Parent:
1:362331cec9b7
Child:
3:e5ea80fae61d
--- a/main.cpp	Thu Aug 20 07:41:02 2015 +0000
+++ b/main.cpp	Sat Aug 29 05:33:30 2015 +0000
@@ -1,5 +1,5 @@
 // 
-// Spidey Wall WebServer
+// LightWall WebServer
 // 
 // Rob Dobson 2015
 
@@ -14,13 +14,18 @@
 
 // Debugging and status
 RawSerial pc(USBTX, USBRX);
-DigitalOut led1(LED1); // ticking (flashes)
+DigitalOut led1(LED1); // flashes on command received
 DigitalOut led2(LED2); //
 DigitalOut led3(LED3); //
 DigitalOut led4(LED4); // web server status
 
+// System configuration
+char systemName[20] = "LightWall";
+int systemNumLEDS = 20;
+int systemLEDSSplitPoint = systemNumLEDS;
+
 // Drawing Manager
-DrawingManager drawingManager(1686, 780);
+DrawingManager drawingManager;
 
 //int ledsCount = 904;
 //int ledSplitPoint = 448;
@@ -142,7 +147,7 @@
 //    // Cmd handler
 //    pLedCmdHandler = new LedCmdHandler(pLedStrip);
 //}
-//
+
 //int main (void)
 //{
 //    pc.baud(115200);
@@ -169,41 +174,83 @@
 // Handle a command
 char* lightwallCmd(int method, char* cmdStr, char* argStr, char* msgBuf)
 {
+    // Blink LED
+    led1 = !led1;
+    
+    // Get message payload
     int cmdLen = RdWebServer::getPayloadLengthFromMsg(msgBuf);
     unsigned char* cmdBuf = RdWebServer::getPayloadDataFromMsg(msgBuf);
     pc.printf("Command Payload Len %d\r\n", cmdLen);
-    if (cmdLen == 256)
-    {
-        for (int i = 0; i < cmdLen; i++)
-            if (cmdBuf[i] != i)
-            {
-                printf("Binary content err at %d\r\n", i);
-                break;
-            }
-    }
+
+    // Process command
     char* respStr = "";
     respStr = drawingManager.start(cmdBuf, cmdLen);
     return respStr;
 }
 
+// Get system name
+char* lightwallGetSystemName(int method, char* cmdStr, char* argStr, char* msgBuf)
+{
+    // Return the system name
+    return systemName;
+}
+
 // Create, configure and run the web server
 void http_thread(void const* arg)
 {
+    // Init the web server
     pc.printf("Starting web server\r\n");
     char* baseWebFolder = "/sd/";  // should be /sd/ for SDcard files - not used for local file system
     RdWebServer webServer;
+    
+    // Add commands to handle the home page and favicon
     webServer.addCommand("", RdWebServerCmdDef::CMD_LOCALFILE, NULL, "index.htm", true);
     webServer.addCommand("favicon.ico", RdWebServerCmdDef::CMD_LOCALFILE, NULL, NULL, true);
+    
+    // Add the lightwall control commands
     webServer.addCommand("cmd", RdWebServerCmdDef::CMD_CALLBACK, &lightwallCmd);
+    webServer.addCommand("name", RdWebServerCmdDef::CMD_CALLBACK, &lightwallGetSystemName);
+    
+    // Start the server
     webServer.init(WEBPORT, &led4, baseWebFolder);
     webServer.run();
 }
 
+void getSystemConfig()
+{
+    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)
+    {
+        char buf[201];
+        buf[sizeof(buf)-1] = 0;
+        int nread = fread(buf, 1, sizeof(buf), fp);
+        if (nread > 0 && nread <= sizeof(buf))
+        {
+            buf[nread] = 0;
+            // Read config details from the file
+            sscanf(buf, "%s %d %d", systemName, &systemNumLEDS, &systemLEDSSplitPoint);
+        }
+        fclose(fp);
+        printf("%s (%d LEDs, Split at %d)", systemName, systemNumLEDS, systemLEDSSplitPoint);
+        printf("\r\n");
+    }
+}
+
 int main() 
 {
     // Init
     pc.baud(115200);
     pc.printf("Light Wall - Rob Dobson 2015\r\n");
+    
+    // Get the configuration of the system
+    getSystemConfig();
+
+    // Drawing manager controls the LEDs
+    drawingManager.init(systemNumLEDS, systemLEDSSplitPoint);
 
     // Setup ethernet interface
     char macAddr[6];
@@ -215,16 +262,12 @@
     pc.printf("IP Address: %s\r\n", EthernetInterface::getIPAddress());
 
     // Web Server
-    Thread httpServer(&http_thread, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 4));
+    Thread httpServer(&http_thread, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 3));
     
-    // Home
-    drawingManager.init();
-
+    // Forever
     while(true)
     {
-//        led1=!led1;
         // Service drawing manager
         drawingManager.service();
-//        Thread::wait(500);
     }
 }