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/
main.cpp
- Committer:
- Bobty
- Date:
- 2015-08-18
- Revision:
- 0:887096209439
- Child:
- 1:362331cec9b7
File content as of revision 0:887096209439:
/* main.cpp
Rob Dobson 2013
More details at ???
*/
#include "mbed.h"
#include "EthernetInterface.h"
#include <stdio.h>
#include <string.h>
#include "RdWebServer.h"
#include "ledstrip.h"
#include "LedCmdHandler.h"
#define PORT 80
Serial pc(USBTX, USBRX);
RdWebServer webServer;
EthernetInterface eth;
DigitalOut led1(LED1); //server listning status
DigitalOut led2(LED2); //socket connecting status
Ticker ledTick;
char nameOfLights[50];
int ledsCount = 904;
int ledSplitPoint = 448;
ledstrip* pLedStrip = NULL;
char* indexHtmName = "index.htm";
const int TICK_MS = 100;
LedCmdHandler* pLedCmdHandler = NULL;
int blinkCtr = 0;
void ledTickfunc()
{
if(webServer.isListening())
{
blinkCtr++;
if (blinkCtr > 1)
{
led1 = !led1;
blinkCtr = 0;
}
}
else
{
led1 = false;
}
if (pLedCmdHandler != NULL)
pLedCmdHandler->NextGen();
}
void handleCmd_ledControl(char* cmdStr, char* argStr)
{
printf("LEDS COMMAND %s %s\r\n", cmdStr, argStr);
if (argStr == NULL)
return;
pLedCmdHandler->DoCommand(argStr);
// Store last command
LocalFileSystem local("local");
FILE* fp = fopen("/local/lastcmd.inf", "w");
if (fp != NULL)
{
fwrite(argStr, 1, strlen(argStr)+1, fp);
fclose(fp);
}
}
void reRunLastCommand()
{
// Store last command
LocalFileSystem local("local");
FILE* fp = fopen("/local/lastcmd.inf", "r");
if (fp != NULL)
{
char buf[501];
buf[sizeof(buf)-1] = 0;
int nread = fread(buf, 1, sizeof(buf), fp);
fclose(fp);
if (nread > 0 && nread <= sizeof(buf))
{
buf[nread] = 0;
pLedCmdHandler->DoCommand(buf);
}
}
}
#include "colourconverters.h"
void BodgeSmooth(ledstrip* pLedStrip)
{
pLedStrip->Clear();
pLedStrip->ShowLeds();
RgbColor startRGB(50,0,0);
HsvColor curHsv = RgbToHsv(startRGB);
while(1)
for (int k = 0; k < 1000; k++)
for (int j = 0; j < 255; j++)
{
pLedStrip->Clear();
RgbColor colrVal = HsvToRgb(curHsv);
pLedStrip->Fill(0,pLedStrip->GetNumLeds(),colrVal.r, colrVal.g, colrVal.b);
pLedStrip->ShowLeds();
wait_ms(250);
curHsv.h++;
}
}
void setLightsConfig()
{
printf("Rob LightWall - Configured for ");
// Check for a config file on the local file system
strcpy(nameOfLights, "Spidey");
LocalFileSystem local("local");
FILE* fp = fopen("/local/spidey.cnf", "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;
sscanf(buf, "%s %d %d", nameOfLights, &ledsCount, &ledSplitPoint);
}
fclose(fp);
printf("%s (%d LEDs, Split at %d)", nameOfLights, ledsCount, ledSplitPoint);
printf("\n\r");
}
// Leds setup
pLedStrip = new ledstrip(ledsCount, ledSplitPoint);
wait_ms(100);
pLedStrip->Clear();
pLedStrip->ShowLeds();
// Cmd handler
pLedCmdHandler = new LedCmdHandler(pLedStrip);
}
int main (void)
{
pc.baud(115200);
setLightsConfig();
BodgeSmooth(pLedStrip);
ledTick.attach(&ledTickfunc,TICK_MS / 1000.0);
// reRunLastCommand();
// setup ethernet interface
eth.init(); //Use DHCP
eth.connect();
printf("IP Address is %s\n\r", eth.getIPAddress());
webServer.addCommand("", RdWebServerCmdDef::CMD_LOCALFILE, NULL, indexHtmName, true);
webServer.addCommand("cmd", RdWebServerCmdDef::CMD_CALLBACK, &handleCmd_ledControl);
webServer.init(PORT, &led2);
webServer.run();
}