Oskar Weigl
/
LED_for_hackspace
LED screen driver build for hackspace.
Revision 0:f16a1d69a386, committed 2012-02-29
- Comitter:
- madcowswe
- Date:
- Wed Feb 29 17:01:43 2012 +0000
- Child:
- 1:1af5060b2a34
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frameout.s Wed Feb 29 17:01:43 2012 +0000 @@ -0,0 +1,77 @@ + AREA framefunc, CODE, READONLY +; Export my_asm function location so that C compiler can find it and link + EXPORT frameout +frameout + +; r0 - dsVal array base address +; r1 - data array base address +; r2 - base address for port 0 +; r3 - loop counter +; r4 - sclk bitmask +; r5 - RGB channels bitmask +; r6 - data reg 1 +; r7 - data reg 2 +; r8 - temporary value holding intensity info (used as an offset into dsVal array) + + +; Save state + PUSH {R4, R5, R6, R7, R8} + +; Load GPIO Port 0 base address in register R6 + LDR R2, =0x2009C000 ; GPIO port 0 base address + +; R3 - loop counter + MOV R3, #256 + +; sclk mask + MOV R4, #0x00010000 ; sclk bitmask + +; RGB channels mask + MOV R5, #0x03800000 ; bitmask for RGB bits + +LOOP + +;NOTE clocking swapped due to inverter used for logic levels| + ;STR R4, [R2, #0x18] ; setting clock high + STR R4, [R2, #0x1C] ; cleark clk to clock in data (negative edge) + + + STR R5, [R2, #0x1C] ; clear RGB via FIOCLEAR + + ; R channel + LDRB R8, [R1], #1 ; read data word (0-255 intensity) and post-increment array pointer to point to next word in data + LDRB R6, [R0, R8] ; loading on/off state from dsVal, pointed to by offset equal to intensity of data + + + ; G channel + LDRB R8, [R1], #1 ; read data word (0-255 intensity) into R8 and post-increment to point to next word in data + LDRB R7, [R0, R8] ; loading on/off state from dsVal, pointed to by offset equal to intensity of data + + AND R7, R7, #0x2 ; pick blue channel bit + + ORR R6, R7, R6, lsr #7 ; store RG bits in R6 with clever stuff in R chan + + ; B channel + LDRB R8, [R1], #1 ; read data word (0-255 intensity) into R8 and post-increment to point to next word in data + LDRB R7, [R0, R8] ; loading on/off state from dsVal, pointed to by offset equal to intensity of data + + AND R7, R7, #0x4 ; pick green channel bit + + ; writing to output + ORR R6, R6, R7 ; RGB bits in R6 + + MOV R6, R6, lsl #23 + + STR R6, [R2,#0x18] ; FIOSET on/off for LED + + SUBS R3, R3, #0x1 ; decrement loop counter + + STR R4, [R2, #0x18] ; setting clock high + + + BNE LOOP + + POP {R4, R5, R6, R7, R8} + + BX LR + END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ledScreen.h Wed Feb 29 17:01:43 2012 +0000 @@ -0,0 +1,260 @@ +#include "mbed.h" + +/* + ****************************************************** + *Hacked together by Imperial College Robotics Society* + ****************************************************** + + Usage: + Example code supplied (main.cpp). Format of data input: 8bit RGB channels per pixel sequential in one framebuffer. + + Note: + This version uses inverted outputs (to bring voltage from 3.3 to 5v and drive more current) for data, clock and address lines. + + Quirks of current platform: + address lines are put through inverters, code still thinks it's addressing with logic 1's, + whereas in reality MA0 is inverted and put into the ribbon cable line of MA1 and vice-versa + +*/ + +extern "C" void frameout(unsigned char dsVal[], unsigned char transformedSource[]); + +class ledScreen { +public: + ledScreen(); + ~ledScreen() {} + + void transformFrame(unsigned char* imageSource); + void transformFrame2(unsigned char* imageSource); + void outputFrame(); + void start(); // start outputting frames on an interrupt + +private: + + int MAX_PULSE_WIDTH; // constant: max enable pulse duration + int pulseLength; // length of current pulse (used in delta-sigma pwm) + int OP_TIME; + + static const int NUM_PANELS = 3; // number of panels horizontally + + int running; + int subFrameCtr; + + Timeout nextFrameTimer; // timeout routine + + // Buffers to hold the RGB data after rearranging to match the LED shifting pattern + unsigned char transformedSource[256*3*NUM_PANELS]; + + // Error values for all 256 brightness levels + unsigned int dsErr[256]; + unsigned int ssdsErr[256]; + + // On/off state per sub-frame for all 256 brightness levels + unsigned char dsVal[256]; + + // Precomputed gamma for all 256 brightness levels + unsigned short gamma[256]; + + + DigitalOut flatch; // data latch (for all connected panels in parallel) + DigitalOut MA0; // module address 0 + DigitalOut MA1; + DigitalOut NREN; // active low enable for red channel (low -> LED on). Note: need to have enable high when latching data + DigitalOut Rdat; // red data + DigitalOut Gdat; // green data + DigitalOut Bdat; // blue data + DigitalOut sclk; // clock + +}; + +ledScreen::ledScreen() : + flatch(p11), // data latch (for all connected panels in parallel) + MA0(p18), // module address 0 + MA1(p19), + NREN(p12), // active low enable for red channel (low -> LED on). Note: need to have enable high when latching data + Rdat(p15), // red data + Gdat(p16), // green data + Bdat(p17), // blue data + sclk(p14) { // clock + + // precompute gamma for every possible RGB intensity value (0-255). + // Gamma correction with gamma = 3, downshifting by 8 to bring the range of values back to 0-65535 + for (int i=0; i<256; i++) { + gamma[i] = pow(i, 2.2) * 0.33;//(i*i*i)>>8; + } + + // initialising lines + flatch = 0; + NREN = 0; + sclk = 0; + + // initialising values + MAX_PULSE_WIDTH = 512; //must currently be a power of 2, and when changing this, you must change the ssdsErr crossover masking + pulseLength = MAX_PULSE_WIDTH; + OP_TIME = 345; //Determined by scoping. Change this every time you change num screens + //NUM_PANELS = 3 + + running=0; + subFrameCtr=0; + + // initialising errors for delta-sigma + for (int j=0; j<256; j++) { + dsErr[j] = 0; + ssdsErr[j] = 0; + } + +} + +void ledScreen::start() { + running=1; + outputFrame(); +} + + +void ledScreen::transformFrame2(unsigned char* imageSource) { + + int psp = 0; // panel space pointer + int tpsp = 0; // target psp + int isp = 8 * 3; // imag espace pointer + // preprocessing the image data to match shifting pattern + for (int panel = 0; panel < NUM_PANELS; panel++) { + // int base = panel * 0x20; //i - image space*/ + + for (int drows = 0; drows < 8; drows++) { + //for (int m = 0; m < 0x1F; m++) { //m - quad block in panel space + + for (tpsp = psp + (8*3); psp < tpsp;) { //0th quad + isp -= 3; + transformedSource[psp++] = imageSource[isp]; + transformedSource[psp++] = imageSource[isp+1]; + transformedSource[psp++] = imageSource[isp+2]; + } + + //next row + isp += 0x10 * NUM_PANELS * 3; + for (tpsp = psp + (8*3); psp < tpsp; isp+=3) { //2nd quad + transformedSource[psp++] = imageSource[isp]; + transformedSource[psp++] = imageSource[isp+1]; + transformedSource[psp++] = imageSource[isp+2]; + } + + //previous row + isp -= (0x10 * NUM_PANELS - 8) * 3; + for (tpsp = psp + (8*3); psp < tpsp;) { //1st quad + isp-=3; + transformedSource[psp++] = imageSource[isp]; + transformedSource[psp++] = imageSource[isp+1]; + transformedSource[psp++] = imageSource[isp+2]; + } + isp += 0x10 * NUM_PANELS * 3; + for (tpsp = psp + (8*3); psp < tpsp; isp+=3) { //3rd quad + transformedSource[psp++] = imageSource[isp]; + transformedSource[psp++] = imageSource[isp+1]; + transformedSource[psp++] = imageSource[isp+2]; + + } + isp += (0x10 * NUM_PANELS - 8) * 3; + } + + isp += (0x10 - 0x20 * NUM_PANELS * 8) * 3; + } +} + +void ledScreen::transformFrame(unsigned char* imageSource) { + unsigned char rotatedSource[256*3*NUM_PANELS]; + + for (int panels = 0; panels < 3; panels++){ + for (int x = 0; x<16; x++){ + for (int y = 0; y<16; y++){ + for (int c = 0; c < 3; c++){ + rotatedSource[((15-x) + panels*16 + 48*y)*3 + c] = imageSource[(y + panels*16 + 48*x)*3 + c]; + } + } + } + } + + transformFrame2(rotatedSource); +} + +// Output one frame and call itself after a period of time if running is set to true +void ledScreen::outputFrame() { + + if (pulseLength != MAX_PULSE_WIDTH) + NREN = 1; // turn off + + if (subFrameCtr<=0) subFrameCtr=36; + subFrameCtr--; + + if (subFrameCtr == 0) { // Every cycle of delta sigma we take a snapshot of the error that needs to be corrected by the short pulses. + for (int i = 0; i < 256; i++) { // This is required to eliminate visible flicker due to beat frequencies otherwise created. + dsErr[i] += ssdsErr[i] & 0xFE000000; + ssdsErr[i] %= 0x10000; + ssdsErr[i] += dsErr[i] % (512 * 0x10000); + dsErr[i] &= 0xFE000000; + } + + // Doing delta sigma for the snapshot + for (int i = 0; i <= 9; i++) { + int lpl = 1<<i; + + if (ssdsErr[i]/0x10000 & lpl) + ssdsErr[i]-=(0x10000-gamma[i])*lpl; + else + ssdsErr[i]+=gamma[i]*lpl; + } + + } + + // produce pulse lengths of 1, 2, 4, ... 256, spread throughout all subframes (only one in four are not MAX_PULSE_WIDTH long) + pulseLength = ((subFrameCtr%4)?MAX_PULSE_WIDTH:(1<<(subFrameCtr>>2))); + + for (int i = 0; i < 256; i++) { + if (pulseLength == MAX_PULSE_WIDTH) { + // Delta-Sigma modulation with variable pulse length weighting + // Based on energy dimensions (time * amplitude) + if (dsErr[i] > (0x10000-gamma[i])*pulseLength) { + dsVal[i] = 0;//-1; Invert as we are using inverting buffers + dsErr[i]-=(0x10000-gamma[i])*pulseLength; + } else { + dsVal[i] = (unsigned char)-1; + dsErr[i]+=gamma[i]*pulseLength; + } + } else { // if short pulse + if (ssdsErr[i]/0x10000 & pulseLength) { + //Doing proper least significant delta sigma live still causes flicker (but only for dim pixels) + //ssdsErr[i]-=(0x10000-gamma[i])*pulseLength; + dsVal[i] = 0; + } else { + dsVal[i] = (unsigned char)-1; + //ssdsErr[i]+=gamma[i]*pulseLength; + } + + } + } + + // output data + for (int i = 0; i < NUM_PANELS; i++) { // NUM_PANELS + MA0 = i&1; + MA1 = i&2; + + frameout(dsVal, &transformedSource[i*256*3]); + } + + NREN = 1; // need to have enables high before every latch, (in case we are on a long pulse) + flatch = 1; // latching all data to LEDs + flatch = 0; + NREN = 0; // turn on LEDs + + if (pulseLength < 4) { // short pulses done through wait + wait_us(pulseLength); + NREN = 1; //Turn off LEDs + + bool wasrunning = running; + running = false; + outputFrame(); //this will recurse only once due to the distrubution of pulses. pulseLength of the next instance will be attached. + running = wasrunning; + } + // long waits done through attaching an interrupt that will turn off the LEDs at the start of next function call. + // Meanwhile, the main code can run between the interrupts. + if (running) nextFrameTimer.attach_us(this, &ledScreen::outputFrame, (pulseLength == MAX_PULSE_WIDTH) ? pulseLength - OP_TIME : pulseLength); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Feb 29 17:01:43 2012 +0000 @@ -0,0 +1,778 @@ +#include "mbed.h" +#include "ledScreen.h" + +LocalFileSystem local("local"); + +// screen instance +ledScreen screen; + +// sin lookup table and related functions +unsigned char sinlut[256]; + +void initSinLut() { + for (int i=0; i<256; i++) + sinlut[i] = cos((float)i / 256.0 * (3.14159265 * 2))*127 + 128; +} + +inline unsigned char lut_sin(int x) { + + return (x>0)?sinlut[x%256]:sinlut[(-x)%256]; +} + + +// Example frame makes: + + +//rainbow +void makeFrame1(unsigned char* data) { + + static int time=0; + time++; + + // override data with a intensity gradient test pattern + for (int x=0; x<3*16; x++) { + for (int y=0; y<16; y++) { + + int i = (x + y*(16*3)) * 3; // figure out the memory location + + data[i] = lut_sin(x*255/48+(time/2)%256+y); //(sin((float)(x+time)/15.0)+1.0)*128 ; // red + data[i+1] = lut_sin(x*255/48+(time/2)%256 + 85+y); //(sin((float)(x+time)/15.0)+1.0)*128 ; // red + data[i+2] = lut_sin(x*255/48+(time/2)%256 +170+y); //(sin((float)(x+time)/15.0)+1.0)*128 ; // red + } + } + +} + +// static gradients +void makeFrame3(unsigned char* data) { + + static int time=0; + time++; + + // override data with a intensity gradient test pattern + for (int x=0; x<3*16; x++) { + for (int y=0; y<16; y++) { + + int i = (x + y*(16*3)) * 3; // figure out the memory location + + data[i] = x*256/48; //(sin((float)(x+time)/15.0)+1.0)*128 ; // red + data[i+1] = 0; // green + data[i+2] = y*256/16; //(i/3)%256 ; // blue + } + } + +} + +// wavy animation +void makeFrame4(unsigned char* data) { + + static int time=0; + time++; + + // override data with a intensity gradient test pattern + for (int x=0; x<3*16; x++) { + for (int y=0; y<16; y++) { + + int i = (x%16 + y*16 + (x/16)*256) * 3; // figure out the memory location + + data[i] = lut_sin(time*15/16 - x*32 + y*32); + data[i+1] = 0; + data[i+2] = lut_sin((((x-24)*(x-24) + (y-8)*(y-8)) - time/1)); + } + } + +} + +// stars + smoothed (convolved) travelling comet +void makeFrame7(unsigned char* data) { + + static int time=0; + + //stars + data[rand()%(3*16*16*3)] = 255; + + //increment time + time++; + + //Do convolution + for (int x=1; x<47; x++) { // ignore first and last column + for (int y=1; y<15; y++) { + if (time%2) { + data[x*3+y*3*48] = ((data[x*3+y*3*48]*30)/32 + (data[(x+1)*3+y*3*48]*1)/32 + (data[(x-1)*3+y*3*48]*1)/32); + data[x*3+y*3*48 +1] = ((data[x*3+y*3*48 +1]*30)/32 + (data[(x+1)*3+y*3*48 +1]*1)/32 + (data[(x-1)*3+y*3*48 +1]*1)/32); + data[x*3+y*3*48 +2] = ((data[x*3+y*3*48 +2]*30)/32 + (data[(x+1)*3+y*3*48 +2]*1)/32 + (data[(x-1)*3+y*3*48 +2]*1)/32); + } else { + data[x*3+y*3*48] = ((data[x*3+y*3*48]*30)/32 + (data[(x)*3+(y+1)*3*48]*1)/32 + (data[(x)*3+(y-1)*3*48]*1)/32); + data[x*3+y*3*48 +1] = ((data[x*3+y*3*48 +1]*30)/32 + (data[(x)*3+(y+1)*3*48 +1]*1)/32 + (data[(x)*3+(y-1)*3*48 +1]*1)/32); + data[x*3+y*3*48 +2] = ((data[x*3+y*3*48 +2]*30)/32 + (data[(x)*3+(y+1)*3*48 +2]*1)/32 + (data[(x)*3+(y-1)*3*48 +2]*1)/32); + } + + } + } + + // handle the border + for (int y=0; y<16; y++) { + if (time%2) { + int x=0; + data[x*3+y*3*48] = (data[x*3+y*3*48]*30)/32 + (data[(x+1)*3+y*3*48]*1)/32 ; + data[x*3+y*3*48 +1] = (data[x*3+y*3*48 +1]*30)/32 + (data[(x+1)*3+y*3*48 +1]*1)/32 ; + data[x*3+y*3*48 +2] = (data[x*3+y*3*48 +2]*30)/32 + (data[(x+1)*3+y*3*48 +2]*1)/32 ; + + x=47; + data[x*3+y*3*48] = ((data[x*3+y*3*48]*30)/32 + (data[(x-1)*3+y*3*48]*1)/32); + data[x*3+y*3*48 +1] = ((data[x*3+y*3*48 +1]*30)/32 + (data[(x-1)*3+y*3*48 +1]*1)/32); + data[x*3+y*3*48 +2] = ((data[x*3+y*3*48 +2]*30)/32 + (data[(x-1)*3+y*3*48 +2]*1)/32); + } + } + + for (int x=0; x<48; x++) { + if (!(time%2)) { + int y=0; + data[x*3+y*3*48] = ((data[x*3+y*3*48]*30)/32 + (data[(x)*3+(y+1)*3*48]*1)/32); + data[x*3+y*3*48 +1] = ((data[x*3+y*3*48 +1]*30)/32 + (data[(x)*3+(y+1)*3*48 +1]*1)/32); + data[x*3+y*3*48 +2] = ((data[x*3+y*3*48 +2]*30)/32 + (data[(x)*3+(y+1)*3*48 +2]*1)/32); + + y=15; + data[x*3+y*3*48] = ((data[x*3+y*3*48]*30)/32 + (data[(x)*3+(y-1)*3*48]*1)/32); + data[x*3+y*3*48 +1] = ((data[x*3+y*3*48 +1]*30)/32 + (data[(x)*3+(y-1)*3*48 +1]*1)/32); + data[x*3+y*3*48 +2] = ((data[x*3+y*3*48 +2]*30)/32 + (data[(x)*3+(y-1)*3*48 +2]*1)/32); + + } + } + + // determine current comet location + int ballx = (8 + sin((float)time/25)*4+sin((float)time/17)*3+sin((float)time/13)*2)*3; + int bally = 8 + sin((float)time/12)*4+sin((float)time/15)*3+sin((float)time/14)*2; + + unsigned char r = lut_sin(time); + unsigned char g = lut_sin(time*15/16); + unsigned char b = lut_sin(time*17/16); + + // saturate brightness to a certain level + while ((int)r+g+b<255) { + r++; + g++; + b++; + }; + + // write the circle of the comet to the buffer + for (int x=-2; x<=2; x++) { + for (int y=-2; y<=2; y++) { + if (x*x + y*y<1.5 ) { + if (x+ballx<16*3 && x+ballx>=0 && y+bally<16 && y+bally>=0) { + int i = (x+ballx)*3 + (y+bally)*3*48; + + data[i] = r; + data[i+1] = g; + data[i+2] = b; + } + } + } + } +} + +struct charsz{ + unsigned char width; + unsigned int data; + + charsz() { + width=0; + } + + charsz(char c) { + width=0; + + } + bool get(int x, int y) + { + return data & (1 << (y * 5 + x)); + } +}; + + +#define _C(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) \ + ((a) | (b << 1) | (c << 2) | (d << 3) | (e << 4) | \ + (f << 5) | (g << 6) | (h << 7) | (i << 8) | (j << 9) | \ + (k << 10) | (l << 11) | (m << 12) | (n << 13) | (o << 14) | \ + (p << 15) | (q << 16) | (r << 17) | (s << 18) | (t << 19) | \ + (u << 20) | (v << 21) | (w << 22) | (x << 23) | (y << 24)) + + + +static charsz numbers[128]; + + +int charToScreen(int xco,int yco, char d, unsigned char *data, unsigned int colour) +{ + + for(int x=0; x<numbers[d].width; x++) + for(int y=0; y<5; y++) + for(unsigned int col = 0; col < 3; ++col) + //data[3 * ((x+xco) + (y+yco) * 48) + col] = numbers[d].get(x,y) ? ((colour & (0xFF << ((2-col)*8))) >> ((2-col)*8) ) : 0; + if (numbers[d].get(x,y) && xco+x<48 && x+xco >= 0) + data[3 * ((x+xco) + (y+yco) * 48) + col] = ((colour & (0xFF << ((2-col)*8))) >> ((2-col)*8) ); + + return numbers[d].width; + + + +} + +void printString(const char *s, float xco, int yco, unsigned char *data, unsigned int col) +{ + unsigned int len = strlen(s); + for (int d=0; d < len; ++d) + { + if(xco >= -numbers[s[d]].width && xco < 48) + charToScreen(xco,yco,s[d],data,col); + + xco += numbers[s[d]].width + 1; + } +} + +void fadeFrame(unsigned char* data, float amount) + { + for (int x = 0; x < 48; x++) + for (int y = 0; y < 16; y++) + { + data[x*3+y*3*48]-=amount; + data[x*3+y*3*48+1]-=amount; + data[x*3+y*3*48+2]-=amount; + } + } + +// Scroll text +class scrollingText { +public: + const char *s; + int xco; + int yco; + unsigned char *data; + unsigned int col; + float scroller; + float scrollspeed; + + scrollingText(const char *sp, int xcop, int ycop, unsigned char *datap, unsigned int colp, float scrollspeedp) + : s(sp), xco(xcop), yco(ycop), data(datap), col(colp), scroller(0), scrollspeed(scrollspeedp) {} + + void update() + { + //printString(s, xco+(int)scroller, yco, data, col); + printString(s, xco+scroller, yco, data, col); + unsigned int len = strlen(s); + int actualStringLength = len+1; + for (int d=0; d < len; ++d) { actualStringLength += numbers[d].width; } + if ((int)scroller+xco < -actualStringLength) { scroller=48-xco; } + + scroller-=scrollspeed; + } +}; + +// Binary counter timer +Timer t; +// Read file counter +Timer s; + +char *txt = NULL; + +void makeFrame9(unsigned char* data) { + fadeFrame(data, 255); + + /* + //0 screen + for(unsigned int x = 0; x < 48; ++x) + for(unsigned int y = 0; y < 16; ++y) + for(unsigned int col = 0; col < 3; ++col) + data[3 * ((x) + y * 48) + col] = 0; + */ + + time_t seconds = time(NULL); + + //uptime! + static scrollingText uptimeText(txt, 4, 1, data, 0xFF0000, 0.1); + + uptimeText.update(); + + + + int yoff=6; + unsigned int startX = 7; + for(unsigned int x = 0; x < 32; ++x) + for(unsigned int y = 0; y < 4; ++y) + for(unsigned int col = 0; col < 3; ++col) + //data[3 * ((x+startX) + (y+yoff) * 48) + col] = (col == 0 ? ((seconds & (1 << (31-x))) ? 255 : 0) : 0); + if(((int)(t.read()*50) & (1 << (31-x))) && col == 0) + data[3 * ((x+startX) + (y+yoff) * 48) + col] = 255; + + int day = (seconds/(3600*24))%10; + int hour = (seconds/3600)%24; + int min = (seconds/60)%60; + int sec = (seconds)%60; + + + char digits[11] = {day+'0',':', (hour/10)+'0', hour%10+'0', ':', min/10+'0', min%10+'0', ':', sec/10+'0', sec%10+'0', 0}; + + + printString(digits, 4, 10, data, 0x0000FF); + +} + + +void readTextFromMBed() +{ + //txt = "test"; + + + //stringy + FILE *set = fopen("/local/scroller.txt", "r"); // Open "scroller.txt" on the local file system for read + if(set) + { + fseek(set, 0L, SEEK_END); + int sz = ftell(set); + fseek(set, 0L, SEEK_SET); + + if(txt) + free(txt); + + txt = (char *) malloc(sz); + + fread(txt, sz, sz, set); + + fclose(set); + } + else + { + txt = "File not found"; + } +} + + + +void initCharArray(); + + +int main() +{ + + initCharArray(); + readTextFromMBed(); + set_time(0); + + s.reset(); + t.start(); + + int time=0; // optional + int frametype=1; // optional + + // framebuffer on client side + unsigned char imageSource[256*3*3] = { 0 }; + + // prepare sin lookup table (optional) + initSinLut(); + + // start the screen output, which will keep outputting the frames that are in its internal buffer (updated via .transformFrame) + screen.start(); + + while (1) { + // Reload the file every 60 seconds + if(s.read()>60) + { + //readTextFromMBed(); + //s.reset(); + } + + time++; //optional + if(time%5000 == 0){ + frametype = (frametype+1)%5; + if (frametype == 0) + time = 4500; + } + + switch (frametype) + { + case 0: + makeFrame9(imageSource); + break; + case 1: + makeFrame4(imageSource); + break; + case 2: + makeFrame7(imageSource); + break; + case 3: + makeFrame7(imageSource); + break; + case 4: + makeFrame1(imageSource); + break; + } + + //makeFrame2(imageSource); // prepare framebuffer with current frame + screen.transformFrame(imageSource); // write framebuffer to output framebuffer + wait_ms(1); // slow down the framerate (optional) + } + +} + + + + + +//////////////////////////////// +///////STOPPP!!!!!!! +//////////GO BACK!!!!!!! +/////////////////////////////// + + + + + + + + + +void initCharArray() +{ + for(int i=0; i<128; i++){ + numbers[i].width=3; + numbers[i].data=_C(1,1,1,0,0, + 0,0,1,0,0, + 0,1,1,0,0, + 0,0,0,0,0, + 0,1,0,0,0); + } + + numbers['A'].width=3; + numbers['A'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0); + numbers['B'].width=3; + numbers['B'].data=_C(1,1,0,0,0, + 1,0,1,0,0, + 1,1,0,0,0, + 1,0,1,0,0, + 1,1,0,0,0); + numbers['C'].width=3; + numbers['C'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,1,1,0,0); + numbers['D'].width=3; + numbers['D'].data=_C(1,1,0,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,1,0,0,0); + numbers['E'].width=3; + numbers['E'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0); + numbers['F'].width=3; + numbers['F'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0, + 1,0,0,0,0, + 1,0,0,0,0); + numbers['G'].width=3; + numbers['G'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,1,0,0, + 1,1,1,0,0); + numbers['H'].width=3; + numbers['H'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0); + numbers['I'].width=3; + numbers['I'].data=_C(1,1,1,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 1,1,1,0,0); + numbers['J'].width=4; + numbers['J'].data=_C(0,1,1,1,0, + 0,0,1,0,0, + 0,0,1,0,0, + 1,0,1,0,0, + 0,1,0,0,0); + numbers['K'].width=4; + numbers['K'].data=_C(1,0,0,1,0, + 1,0,1,0,0, + 1,1,1,0,0, + 1,0,1,0,0, + 1,0,0,1,0); + numbers['L'].width=3; + numbers['L'].data=_C(1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,1,1,0,0); + numbers['M'].width=5; + numbers['M'].data=_C(1,1,0,1,1, + 1,1,1,1,1, + 1,0,1,0,1, + 1,0,0,0,1, + 1,0,0,0,1); + numbers['N'].width=4; + numbers['N'].data=_C(1,0,0,1,0, + 1,1,0,1,0, + 1,1,1,1,0, + 1,0,1,1,0, + 1,0,0,1,0); + numbers['O'].width=3; + numbers['O'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0); + numbers['P'].width=3; + numbers['P'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 1,0,0,0,0, + 1,0,0,0,0); + numbers['Q'].width=3; + numbers['Q'].data=_C(0,1,1,0,0, + 1,0,0,1,0, + 1,0,0,1,0, + 1,0,1,1,0, + 0,1,1,1,0); + numbers['R'].width=3; + numbers['R'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 1,1,0,0,0, + 1,0,1,0,0); + numbers['S'].width=3; + numbers['S'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0, + 0,0,1,0,0, + 1,1,1,0,0); + numbers['T'].width=3; + numbers['T'].data=_C(1,1,1,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 0,1,0,0,0); + numbers['U'].width=3; + numbers['U'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0); + numbers['V'].width=3; + numbers['V'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 0,1,0,0,0); + numbers['W'].width=5; + numbers['W'].data=_C(1,0,0,0,1, + 1,0,0,0,1, + 1,0,1,0,1, + 1,1,1,1,1, + 0,1,0,1,0); + numbers['X'].width=3; + numbers['X'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 0,1,0,0,0, + 1,1,1,0,0, + 1,0,1,0,0); + numbers['Y'].width=3; + numbers['Y'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 0,1,0,0,0); + numbers['Z'].width=3; + numbers['Z'].data=_C(1,1,1,0,0, + 0,0,1,0,0, + 0,1,0,0,0, + 1,0,0,0,0, + 1,1,1,0,0); + numbers['\''].width=1; + numbers['\''].data=_C(1,0,0,0,0, + 1,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0); + numbers['"'].width=3; + numbers['"'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0); + numbers[' '].width=1; + numbers[' '].data=_C(0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0); + numbers[':'].width=1; + numbers[':'].data=_C(0,0,0,0,0, + 1,0,0,0,0, + 0,0,0,0,0, + 1,0,0,0,0, + 0,0,0,0,0); + + numbers['0'].width=3; + numbers['0'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0); + numbers['1'].width=1; + numbers['1'].data=_C(1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0); + numbers['2'].width=3; + numbers['2'].data=_C(1,1,1,0,0, + 0,0,1,0,0, + 1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0); + numbers['3'].width=3; + numbers['3'].data=_C(1,1,1,0,0, + 0,0,1,0,0, + 1,1,1,0,0, + 0,0,1,0,0, + 1,1,1,0,0); + numbers['4'].width=3; + numbers['4'].data=_C(1,0,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 0,0,1,0,0, + 0,0,1,0,0); + numbers['5'].width=3; + numbers['5'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0, + 0,0,1,0,0, + 1,1,1,0,0); + numbers['6'].width=3; + numbers['6'].data=_C(1,1,1,0,0, + 1,0,0,0,0, + 1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0); + numbers['7'].width=3; + numbers['7'].data=_C(1,1,1,0,0, + 0,0,1,0,0, + 0,0,1,0,0, + 0,0,1,0,0, + 0,0,1,0,0); + numbers['8'].width=3; + numbers['8'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0); + numbers['9'].width=3; + numbers['9'].data=_C(1,1,1,0,0, + 1,0,1,0,0, + 1,1,1,0,0, + 0,0,1,0,0, + 0,0,1,0,0); + + numbers['.'].width=1; + numbers['.'].data=_C(0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 1,0,0,0,0); + + numbers['|'].width=1; + numbers['|'].data=_C(1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0); + + numbers[')'].width=2; + numbers[')'].data=_C(1,0,0,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 0,1,0,0,0, + 1,0,0,0,0); + + numbers['('].width=2; + numbers['('].data=_C(0,1,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 1,0,0,0,0, + 0,1,0,0,0); + + numbers['+'].width=3; + numbers['+'].data=_C(0,0,0,0,0, + 0,1,0,0,0, + 1,1,1,0,0, + 0,1,0,0,0, + 0,0,0,0,0); + + numbers['-'].width=3; + numbers['-'].data=_C(0,0,0,0,0, + 0,0,0,0,0, + 1,1,1,0,0, + 0,0,0,0,0, + 0,0,0,0,0); + + numbers[';'].width=2; + numbers[';'].data=_C(0,0,0,0,0, + 0,1,0,0,0, + 0,0,0,0,0, + 0,1,0,0,0, + 1,0,0,0,0); + + numbers['>'].width=3; + numbers['>'].data=_C(1,0,0,0,0, + 0,1,0,0,0, + 0,0,1,0,0, + 0,1,0,0,0, + 1,0,0,0,0); + + numbers[','].width=2; + numbers[','].data=_C(0,0,0,0,0, + 0,0,0,0,0, + 0,0,0,0,0, + 0,1,0,0,0, + 1,0,0,0,0); + + numbers['_'] = numbers[' ']; + numbers['a'] = numbers['A']; + numbers['b'] = numbers['B']; + numbers['c'] = numbers['C']; + numbers['d'] = numbers['D']; + numbers['e'] = numbers['E']; + numbers['f'] = numbers['F']; + numbers['g'] = numbers['G']; + numbers['h'] = numbers['H']; + numbers['i'] = numbers['I']; + numbers['j'] = numbers['J']; + numbers['k'] = numbers['K']; + numbers['l'] = numbers['L']; + numbers['m'] = numbers['M']; + numbers['n'] = numbers['N']; + numbers['o'] = numbers['O']; + numbers['p'] = numbers['P']; + numbers['q'] = numbers['Q']; + numbers['r'] = numbers['R']; + numbers['s'] = numbers['S']; + numbers['t'] = numbers['T']; + numbers['u'] = numbers['U']; + numbers['v'] = numbers['V']; + numbers['w'] = numbers['W']; + numbers['x'] = numbers['X']; + numbers['y'] = numbers['Y']; + numbers['z'] = numbers['Z']; + +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Feb 29 17:01:43 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/4c0c40fd0593