Hackers Delight Weekender light display

Dependencies:   NetServices mbed

Files at this revision

API Documentation at this revision

Comitter:
user3259784281760646093
Date:
Sun Aug 07 14:51:38 2011 +0000
Commit message:

Changed in this revision

NetServices.lib Show annotated file Show diff for this revision Revisions of this file
RPCInterface.lib Show annotated file Show diff for this revision Revisions of this file
font.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NetServices.lib	Sun Aug 07 14:51:38 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/segundo/code/NetServices/#4e2468d7d5cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RPCInterface.lib	Sun Aug 07 14:51:38 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/MichaelW/code/RPCInterface/#a9e2c45097c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/font.h	Sun Aug 07 14:51:38 2011 +0000
@@ -0,0 +1,29 @@
+const unsigned char FONT[27][4] = {
+0x0F,0x14,0x14,0x0F, // A
+0x1F,0x11,0x15,0x0A, // B
+0x0E,0x11,0x11,0x0A, // C
+0x1F,0x11,0x11,0x0E, // D
+0x1F,0x15,0x15,0x11, // E
+0x1F,0x14,0x14,0x10, // F
+0x0E,0x11,0x15,0x06, // G
+0x1F,0x04,0x04,0x1F, // H
+0x11,0x1F,0x11,0x11, // I
+0x12,0x11,0x11,0x1E, // J
+0x1F,0x11,0x11,0x09, // K
+0x1F,0x01,0x01,0x01, // L
+0x1F,0x08,0x0C,0x1F, // M
+0x1F,0x08,0x04,0x1F, // N
+0x0E,0x11,0x11,0x0E, // O
+0x1F,0x14,0x14,0x08, // P 0x50
+0x0E,0x11,0x13,0x0F, // Q
+0x1F,0x14,0x14,0x0B, // R
+0x0A,0x19,0x15,0x0A, // S
+0x10,0x1F,0x10,0x10, // T
+0x1E,0x01,0x01,0x1E, // U
+0x1C,0x02,0x03,0x1E, // V
+0x1E,0x01,0x03,0x1E, // W
+0x11,0x0E,0x0E,0x11, // X
+0x10,0x08,0x0F,0x10, // Y
+0x13,0x15,0x15,0x19, // Z
+0x00,0x00,0x00,0x00, // space 0x20
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Aug 07 14:51:38 2011 +0000
@@ -0,0 +1,397 @@
+#include "mbed.h"
+
+#include "string.h"
+//#include "RPCFunction.h"
+#include "font.h"
+
+//#include "EthernetNetIf.h"
+//#include "HTTPServer.h"
+
+
+
+#define cell_height 5
+#define cell_width 4
+#define numberofcolumns 16
+
+#define numberofchars 10
+
+#define string1length 28
+#define string2length 36
+
+#define maxtextlength 160
+
+#define numberofbuffercolumns maxtextlength * (cell_width + 1)
+#define bufferendspace 16
+
+#define maxdisplayx 10
+#define maxdisplayy 4
+
+
+DigitalOut myLed1(LED1);
+DigitalOut myLed2(LED2);
+DigitalOut signal1(p8);
+DigitalOut signal2(p10);
+Serial pc(USBTX, USBRX); // tx, rx
+
+
+typedef int cellarray[numberofcolumns][cell_height];
+typedef int bufferarray[numberofbuffercolumns + bufferendspace][cell_height];
+
+
+bufferarray bitmap;
+cellarray displaybitmap;
+    
+int fgcolour = 1;
+int bgcolour = 0;    
+
+const int bitsPerBulb = 26;
+const int numberOfBulbs = 56;
+int ten = 10; // Ten microseconds
+int twenty = 20; // Twenty microseconds
+int coordTable[55] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33 , 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54};
+int bulbBitStream[bitsPerBulb * numberOfBulbs];
+
+
+void create_bitmap(bufferarray bitmap, char* displaystring, int colour);
+void text_update(char * input, char * output);
+void fgcol_update(char * input, char * output);
+void bgcol_update(char * input, char * output);
+
+void scroll(void);
+
+void create_string(cellarray bitmap, int startbulb, int length, int stringarray[]);
+
+void setBulbValue(int bulbNum, int red, int green, int blue);
+void updateString(void);
+void setPixel(int xCoord, int yCoord, int red, int green, int blue);
+
+/*
+RPCFunction rpc_text_update(&text_update, "text");
+RPCFunction rpc_fgcol_update(&fgcol_update, "fgcolour");
+RPCFunction rpc_bgcol_update(&bgcol_update, "bgcolour");
+*/
+char* displaytext;
+//EthernetNetIf eth;  
+//HTTPServer svr;
+
+int offset = 0;
+bool updatetextrequired = false;
+
+#define maxoffset numberofbuffercolumns * cell_height
+
+Ticker scroll_ticker;
+
+int main(void)
+{
+     
+    displaytext = (char*)malloc(maxtextlength * sizeof(char));
+/*
+    printf("Setting up Ethernet...\n");
+    EthernetErr ethErr = eth.setup();
+    if(ethErr)
+    {
+        printf("Error %d in setup.\n", ethErr);
+        return -1;
+    }
+    printf("Ethernet setup OK\n");
+
+    FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path
+    svr.addHandler<FSHandler>("/"); //Default handler
+
+    svr.addHandler<RPCHandler>("/rpc");
+    svr.bind(80);
+*/
+    //enumerate String 1 of bulb bitstream array.
+    for (int bulb = 0 ; bulb < numberOfBulbs ; bulb++) {
+        setBulbValue(bulb, 0, 0, 0); // all WHITE
+    }
+    updateString();
+
+/*    while(true)
+    {
+        Net::poll();
+    }
+
+    while (true) {
+        for (int y = 0 ; y < 5 ; y++) {
+            for  (int x = 0 ; x < 11 ; x++) {
+            
+                Net::poll();
+                setPixel (x, y, 13, 0, 0);
+                updateString();
+                
+                Net::poll();
+                setPixel (x, y, 0, 0, 13);
+                updateString();
+            }
+        }
+    }*/
+
+    strcpy(displaytext, "ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
+   
+    create_bitmap(bitmap, displaytext, 1); 
+    updatetextrequired = false;
+   
+    scroll_ticker.attach(&scroll, 0.07);
+    
+    while(1)
+    {
+        //Net::poll();
+        if(offset == 0 && updatetextrequired == true)
+        {
+            create_bitmap(bitmap, displaytext, 1); 
+            updatetextrequired = false;
+        }
+    }    
+
+    return(0);
+}
+
+void scroll(void)
+{
+    
+    int red;
+    int green;
+    int blue;
+ 
+//    printf("Scroll function offset %d (maxoffset = %d)\r\n", offset, maxoffset);
+
+
+    for(int y = 0; y<maxdisplayy+1; y++)
+    {
+        for(int x =0; x<maxdisplayx+1; x++)
+        {   
+            int pixelcolour;
+            pixelcolour = bitmap[x+offset][y];
+//            printf("%d",pixelcolour);
+            if (pixelcolour == 1) {pixelcolour = 13;} else {pixelcolour = 0;}
+            setPixel(x,y,pixelcolour,pixelcolour,pixelcolour);
+            
+        }   
+//        printf("\r\n");
+    }
+
+
+
+
+    updateString();
+
+    offset++;
+    if(offset >= 40)
+    {
+        offset = 0;
+    }
+}
+
+
+void text_update(char * input, char * output)
+{
+    int inputtextlength;
+    int displaytextlength;
+    
+    displaytextlength = maxtextlength;
+    inputtextlength = sizeof(input);
+    if (inputtextlength < maxtextlength)
+    {
+        displaytextlength = inputtextlength;
+    }
+    
+    strncpy(displaytext, input, displaytextlength);
+    
+    updatetextrequired = true;
+    
+}
+
+
+void fgcol_update(char * input, char * output)
+{
+    fgcolour = atoi(input);
+    updatetextrequired = true;
+}
+
+void bgcol_update(char * input, char * output)
+{
+    bgcolour = atoi(input);
+    updatetextrequired = true;
+}
+
+void create_string(bufferarray bitmap, int startbulb, int length, int stringarray[])
+{
+    int *buff;
+    
+    buff = (int*)bitmap;
+    
+    for (int string_iter = 0; string_iter < length; string_iter++)
+    {
+     //   stringarray[string_iter - startbulb] = bitmap[string_iter];
+    }
+}
+
+void create_bitmap(bufferarray bitmap, char* displaystring, int colour)
+{
+    int displaystringlen;
+    
+    printf("create_bitmap %s\r\n", displaystring);
+    
+    displaystringlen = strlen(displaystring);
+    
+    
+    if(displaystringlen > numberofchars) {displaystringlen = numberofchars;}
+    
+    for(int displaychar = 0; displaychar < numberofchars; displaychar++ )
+    {
+        int fontref = 26; //default to space
+        unsigned char asciichar;
+        
+        
+        
+        asciichar = (unsigned char)(displaystring[displaychar]);
+        
+        
+        if (asciichar == 32) {fontref = 26;} //convert ascii space to font
+        if (asciichar > 64 && asciichar < 91){fontref = asciichar - 65;}// convert uppercase to font
+        if (asciichar > 96 && asciichar < 123){fontref = asciichar - 97;}// convert lowercase to font (hacked to upper)
+    
+        printf("char %c, fontref %d\r\n", asciichar, fontref);
+        
+            unsigned char mask = 0x10; //MAGIC NUMBER, x=0 == top
+        for (int columnoffset = 0; columnoffset < cell_width-1; columnoffset++)
+        {
+            
+            
+            for (int row = 0; row < cell_height; row++)
+            {
+                int bulbcontents=0;
+                
+                printf("Fontref %x, masked %x (mask %x)\r\n",FONT[fontref][row],(FONT[fontref][row] & mask), mask);
+                
+                if ((FONT[fontref][row] & mask) !=0) {bulbcontents = fgcolour;} else {bulbcontents = bgcolour;}
+            
+                bitmap[displaychar * (cell_width + 1) + columnoffset][row] = bulbcontents; //cell_width + 1 for 1 col space between chars             
+                
+            }
+                mask = mask >> 1;   
+        }
+        
+    }
+        for(int y=0; y<cell_height; y++)
+        {
+            for(int x=displaychar * 5; x<100; x++)
+            {
+                printf("%d ", bitmap[x][y]);
+            }
+            printf("\r\n");
+        }
+}
+
+void setPixel(int xCoord, int yCoord, int red, int green, int blue) {
+    setBulbValue(coordTable[(yCoord * 11) + xCoord], red, green, blue);
+}
+
+
+void setBulbValue(int bulbNum, int red, int green, int blue) {
+
+    int intensity = 204;
+
+    int bulbBitstreamStart = (bulbNum * bitsPerBulb); // So this seems right.
+
+    // Bulb number
+    //pc.printf("Bulb %d ", bulbNum);
+    for (int loop = 5 ; loop >= 0 ; loop--) {
+
+        if ((bulbNum % 2) > 0) {
+            bulbBitStream[bulbBitstreamStart + loop] = 1;
+            //pc.printf("1");
+        } else {
+            bulbBitStream[bulbBitstreamStart + loop] = 0;
+            // pc.printf("0");
+        }
+        bulbNum = bulbNum / 2;
+    }
+    // Intensity
+    //pc.printf(" Intensity %d ", intensity);
+    for (int loop = 13 ; loop >= 6 ; loop--) {
+
+        if ((intensity % 2) > 0) {
+            bulbBitStream[bulbBitstreamStart + loop] = 1;
+            //pc.printf("1");
+        } else {
+            bulbBitStream[bulbBitstreamStart + loop] = 0;
+            //pc.printf("0");
+        }
+        intensity = intensity / 2;
+    }
+    // Blue
+    //pc.printf(" Blue %d ", blue);
+    for (int loop = 17 ; loop >= 14 ; loop--) {
+
+        if ((blue % 2) > 0) {
+            bulbBitStream[bulbBitstreamStart + loop] = 1;
+            //pc.printf("1");
+        } else {
+            bulbBitStream[bulbBitstreamStart + loop] = 0;
+            //pc.printf("0");
+        }
+        blue = blue / 2;
+
+    }
+    // Green
+    //pc.printf(" Green %d ", green);
+    for (int loop = 21 ; loop >= 18 ; loop--) {
+
+        if ((green % 2) > 0) {
+            bulbBitStream[bulbBitstreamStart + loop] = 1;
+            //pc.printf("1");
+        } else {
+            bulbBitStream[bulbBitstreamStart + loop] = 0;
+            //pc.printf("0");
+        }
+        green = green / 2;
+    }
+    // Red
+    //pc.printf(" Red %d ", red);
+    for (int loop = 25 ; loop >= 22 ; loop--) {
+
+        if ((red % 2) > 0) {
+            bulbBitStream[bulbBitstreamStart + loop] = 1;
+            //pc.printf("1");
+        } else {
+            bulbBitStream[bulbBitstreamStart + loop] = 0;
+            //pc.printf("0");
+        }
+        red = red / 2;
+    }
+}
+
+void updateString(void) {
+    // set bus state low for 60 microseconds to make sure we're reset.
+    signal1 = 0;
+    wait_us(twenty * 3);
+
+    for (int x = 0; x < numberOfBulbs ; x++) //Iterate for as many bulbs are in the string
+    {// x
+        //Start Bit: High for 10microSeconds
+        signal1 = 1;
+        wait_us(ten);
+        signal1 = 0;
+
+        for (int i = 0; i < bitsPerBulb; i++) { // i
+            if (bulbBitStream[i + (x * bitsPerBulb)] == 0) {
+                signal1 = 0;
+                wait_us(ten);
+                signal1 = 1;
+                wait_us(twenty);
+                signal1 = 0;
+            } else {
+                signal1 = 0;
+                wait_us(twenty);
+                signal1 = 1;
+                wait_us(ten);
+                signal1 = 0;
+            }
+        } // i
+        wait_us(twenty*2); // Wait AT LEAST 30 microseconds to end frame, so 40 in this case.
+    }// x
+
+
+} // end updateString ()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Aug 07 14:51:38 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912