Hackers Delight Weekender light display

Dependencies:   NetServices mbed

Revision:
0:937a0073cc9d
--- /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