Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:cfce61ec00c6, committed 2011-09-14
- Comitter:
- emmanuelchio
- Date:
- Wed Sep 14 05:37:48 2011 +0000
- Commit message:
- Rev 1.0
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SMARTGPU.lib Wed Sep 14 05:37:48 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/emmanuelchio/code/SMARTGPU/#8da93960a86b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Sep 14 05:37:48 2011 +0000
@@ -0,0 +1,726 @@
+/**************************************************************************************/
+/*SMARTGPU intelligent embedded graphics processor unit
+ those examples are for use the SMARTGPU with the mbed microcontoller, just connect tx,rx,and reset
+ Board:
+ http://www.vizictechnologies.com/#/desarrollo/4554296549
+
+ This example requires pre-loaded content to the micro SD card, images!
+
+ www.vizictechnologies.com
+ Vizic Technologies copyright 2011 */
+/**************************************************************************************/
+/**************************************************************************************/
+
+#include "mbed.h"
+#include "SMARTGPU.h"
+
+SMARTGPU lcd(p13,p14,p15); //(TX,RX,Reset);
+
+//Each time we use the touchscreen we must define a int array that stores the X and Y readed or touched coordinates.
+int touch[2];
+//Each time we use the touchicon we must define a char array that stores the name of the touched icon.
+char icon[3];
+
+char pixelArray[3]; //Array to store the RGB888 pixel obtained with memoryRead()
+
+
+/**************************************************/
+//Funcion to convert a 3 byte array to an int RGB565
+int RGB888ToRGB565(char pixBuffer[]){ //get an array of 3 bytes( red, green, blue), and convert them to RGB565 returned in an int
+ unsigned char R,G,B;
+ unsigned int col;
+ unsigned long colour;
+
+ R=pixBuffer[0];
+ G=pixBuffer[1];
+ B=pixBuffer[2];
+ ((unsigned char *) &colour)[1]=(R & 0xF8);
+ R=G;
+ G=G>>5;
+ ((unsigned char *) &colour)[1]|=G;
+ G=(R<<3)& 0xE0;
+ ((unsigned char *) &colour)[0]=B;
+ ((unsigned char *) &colour)[0]=((unsigned char *) &colour)[0]>>3;
+ ((unsigned char *) &colour)[0]|=G;
+ col=colour;
+ return col;
+}
+
+//Main applications, the next applications are called by the main loop menu
+/**************************************************/
+/**************************************************/
+/**************************************************/
+//clock application
+char clocks(){
+ int hours=4,mins=48,secs=0;
+ int halfx=160 ,halfy=129;
+ int xs,ys,xm,ym,xh,yh,n;
+ int angleH,angleM,angleS;
+ int handHour=45;//hand size
+ int handMin=57;//hand size
+ int handSec=62;//hand size
+ int colBackClk,colHour=WHITE,colMin=WHITE,colSec=WHITE;
+ char carClk=1,clockNextFlag;
+
+ while(1){ //we loop between clocks until a touch on icons
+ switch(carClk){
+ case 1:
+ lcd.imageSD(0,0,"oldclk"); //load the clock face
+ colHour=BLACK; //change the colour of the clock hands
+ colMin=BLACK;
+ colSec=RED;
+ handHour=45; //hands size
+ handMin=57;
+ handSec=62;
+ break;
+ case 2:
+ lcd.imageSD(0,0,"colclk"); //load the clock face
+ colHour=RED; //change the colour of the clock hands
+ colMin=BLUE;
+ colSec=YELLOW;
+ handHour=58; //hands size
+ handMin=65;
+ handSec=70;
+ break;
+ case 3:
+ lcd.imageSD(0,0,"purclk"); //load the clock face
+ colHour=WHITE; //change the colour of the clock hands
+ colMin=WHITE;
+ colSec=WHITE;
+ handHour=47; //hands size
+ handMin=55;
+ handSec=64;
+ break;
+ default:
+ break;
+ }
+ lcd.imageSD(0,0,"WinHead"); //draw header
+ lcd.memoryRead(halfx,halfy,halfx,halfy,pixelArray); //This function return a 24 bit pixel array,
+ colBackClk=RGB888ToRGB565(pixelArray); //we get the back colour of the clock to erase the hands with the same colour
+ clockNextFlag=0; //turn off next clock flag
+ while(clockNextFlag==0){
+ //Do some Math to get the second point of the clock hands. (first point is always the center of the clock)
+ angleS=secs*6; //get the current seconds in angle form, a circle have 360 degrees divided by 60 seconds = 6, then we multiply the 6 by the current seconds to get current angle
+ xs=(sin((angleS*3.14)/180)) * handSec; //get X component of the second's hand
+ ys=(cos((angleS*3.14)/180)) * handSec; //get Y component of the second's hand
+ angleM=mins*6; //get the current minutes in angle form, a circle have 360 degrees divided by 60 minutes = 6, then we multiply the 6 by the current minutes to get current angle
+ xm=(sin((angleM*3.14)/180)) * handMin; //get X component of the minutes's hand
+ ym=(cos((angleM*3.14)/180)) * handMin; //get Y component of the minutes's hand
+ angleH=hours*30; //get the current hours in angle form, a circle have 360 degrees divided by 12 hours = 30, then we multiply the 30 by the current hours to get current angle
+ xh=(sin((angleH*3.14)/180)) * handHour; //get X component of the hours's hand
+ yh=(cos((angleH*3.14)/180)) * handHour; //get Y component of the hours's hand
+
+ //Draw current time hands
+ lcd.drawLine(halfx,halfy,halfx+xm,halfy-ym,colMin); // Draw the minutes hand, first point is the center of the clock, and the second is the point obtained by doing math
+ lcd.drawLine(halfx,halfy,halfx+xh,halfy-yh,colHour); // Draw the hours hand, first point is the center of the clock, and the second is the point obtained by doing math
+ lcd.drawLine(halfx,halfy,halfx+xs,halfy-ys,colSec); // Draw the seconds hand, first point is the center of the clock, and the second is the point obtained by doing math
+ lcd.drawCircle(halfx,halfy,3,colSec,FILL); // Draw the center of the second's hand
+
+ for(n=0;n<210;n++){ // loop for about one second delay (we dont need to explain why we're waiting one second, right?)
+ if(lcd.touchScreen(touch)){
+ carClk++; // increase clock Counter to select and load next clock
+ if(carClk==4){
+ carClk=1;
+ }
+ clockNextFlag=1; // turn on flag to change clock
+ break;
+ }
+ if(lcd.touchIcon(icon)){ // if we receive a touch on icons we exit
+ return 0; // exit
+ }
+ }
+
+ //time managing
+ secs++; // increase seconds
+ if(secs==60){ // if we reach 60 seconds
+ mins++; // increase the minutes
+ if(mins==60){ // if we reach 60 minutes
+ hours++; // increase the minutes
+ if(hours==12){ // if we reach 12 hours
+ hours=0; // clear hours
+ }
+ mins=0; // clear minutes
+ }
+ secs=0; // clear seconds
+ }
+
+ //Erase all hands
+ lcd.drawLine(halfx,halfy,halfx+xs,halfy-ys,colBackClk); // Erase Second's hand
+ lcd.drawLine(halfx,halfy,halfx+xm,halfy-ym,colBackClk); // Erase Minute's hand
+ lcd.drawLine(halfx,halfy,halfx+xh,halfy-yh,colBackClk); // Erase Hour's hand
+ }
+ }
+}
+
+/**************************************************/
+/**************************************************/
+//calc application
+void calculator(){
+ unsigned char auxCalc=0;
+ char number=0;
+ int sums=0;
+ char num1[2]={0};
+ char num2[2]={0};
+ char result[4]={0};
+ char operation[2]={0};
+
+ lcd.imageSD(0,0,"Calc"); //load calc design
+ lcd.imageSD(0,0,"WinHead"); //draw header
+ lcd.string(224,34,255,65,BLACK,FONT7,TRANS,"0"); //draw numbers
+ lcd.string(80,36,100,55,BLACK,FONT0,TRANS,"0");
+
+ //Start application
+ while(1){ //while touch on icons
+ while(lcd.touchScreen(touch)==0 & lcd.touchIcon(icon)==0); //wait for a touch to do something
+ if(lcd.touchIcon(icon)==1){ //if the received touch was on any icon we go to main menu
+ break;
+ }
+ if(touch[YCOORD]>73 & touch[YCOORD]<101){ //first row
+ if(touch[XCOORD]>74 & touch[XCOORD]<117){
+ auxCalc='E';
+ }else if(touch[XCOORD]>116 & touch[XCOORD]<161){
+ auxCalc='I';
+ }else if(touch[XCOORD]>161 & touch[XCOORD]<205){
+ auxCalc='/';
+ }else if(touch[XCOORD]>204 & touch[XCOORD]<249){
+ auxCalc='X';
+ }
+ }else if(touch[YCOORD]>100 & touch[YCOORD]<130){ //second row
+ if(touch[XCOORD]>74 & touch[XCOORD]<117){
+ auxCalc=7;
+ }else if(touch[XCOORD]>116 & touch[XCOORD]<161){
+ auxCalc=8;
+ }else if(touch[XCOORD]>161 & touch[XCOORD]<205){
+ auxCalc=9;
+ }else if(touch[XCOORD]>204 & touch[XCOORD]<249){
+ auxCalc='-';
+ }
+ }else if(touch[YCOORD]>129 & touch[YCOORD]<159){ //third row
+ if(touch[XCOORD]>74 & touch[XCOORD]<117){
+ auxCalc=4;
+ }else if(touch[XCOORD]>116 & touch[XCOORD]<161){
+ auxCalc=5;
+ }else if(touch[XCOORD]>161 & touch[XCOORD]<205){
+ auxCalc=6;
+ }else if(touch[XCOORD]>204 & touch[XCOORD]<249){
+ auxCalc='+';
+ }
+ }else if(touch[YCOORD]>158 & touch[YCOORD]<188){ //fourth row
+ if(touch[XCOORD]>74 & touch[XCOORD]<117){
+ auxCalc=1;
+ }else if(touch[XCOORD]>116 & touch[XCOORD]<161){
+ auxCalc=2;
+ }else if(touch[XCOORD]>161 & touch[XCOORD]<205){
+ auxCalc=3;
+ }else if(touch[XCOORD]>204 & touch[XCOORD]<249){
+ auxCalc='R';
+ }
+ }else if(touch[YCOORD]>187 & touch[YCOORD]<215){ //fifth row
+ if(touch[XCOORD]>74 & touch[XCOORD]<117){
+ auxCalc=0;
+ }else if(touch[XCOORD]>116 & touch[XCOORD]<161){
+ auxCalc=0;
+ }else if(touch[XCOORD]>204 & touch[XCOORD]<249){
+ auxCalc='R';
+ }
+ }else{
+ auxCalc='N';
+ }
+ if(number==0){ //get first number
+ if(auxCalc<10){
+ num1[0]=auxCalc+0x30;
+ }else{
+ if(auxCalc=='E'){
+ num1[0]=0x30;
+ }else{
+ operation[0]=auxCalc;
+ if(operation[0]!='R' & operation[0]!='N' & operation[0]!='I'){
+ number++;
+ lcd.drawRectangle(224,34,248,58,0xD6B6,FILL);
+ wait_ms(200);
+ lcd.string(90,36,100,55,BLACK,FONT0,TRANS,operation);
+ }
+ }
+ }
+ lcd.drawRectangle(80,36,87,46,0xD6B6,FILL);
+ lcd.drawRectangle(224,34,248,58,0xD6B6,FILL);
+ lcd.string(224,34,255,65,BLACK,FONT7,TRANS,num1);
+ lcd.string(80,36,100,55,BLACK,FONT0,TRANS,num1);
+ num2[0]=0;
+ }else if (number==1){ //get second number
+ if(auxCalc<10){
+ num2[0]=auxCalc+0x30;
+ }else{
+ if(auxCalc=='E'){
+ num2[0]=0x30;
+ }else{
+ if(auxCalc=='R'){
+ switch(operation[0]){
+ case '+':
+ sums=(num1[0]-0x30);
+ sums+=(num2[0]-0x30);
+ break;
+ case '-':
+ sums=(num1[0]-0x30);
+ sums-=(num2[0]-0x30);
+ break;
+ case 'X':
+ sums=(num1[0]-0x30);
+ sums*=(num2[0]-0x30);
+ break;
+ case '/':
+ sums=(num1[0]-0x30);
+ sums/=(num2[0]-0x30);
+ break;
+ default:
+ sums=(num1[0]-0x30);
+ sums+=(num2[0]-0x30);
+ break;
+ }
+ if(sums<0){
+ result[0]='-';
+ result[1]=(-1*(sums/10))+0x30;
+ result[2]=(-1*(sums%10))+0x30;
+ }else{
+ result[0]=' ';
+ result[1]=(sums/10)+0x30;
+ result[2]=(sums%10)+0x30;
+ }
+ lcd.string(100,36,110,55,BLACK,FONT0,TRANS,num2);
+ lcd.string(110,36,120,55,BLACK,FONT0,TRANS,"=\0");
+ lcd.drawRectangle(224,34,248,58,0xD6B6,FILL);
+ lcd.string(192,34,255,65,BLACK,FONT7,TRANS,result);
+ number++;
+ wait_ms(200);
+ }
+ }
+ }
+ if(number<2){
+ lcd.drawRectangle(100,36,107,46,0xD6B6,FILL);
+ lcd.drawRectangle(224,34,248,58,0xD6B6,FILL);
+ lcd.string(224,34,255,65,BLACK,FONT7,TRANS,num2);
+ lcd.string(100,36,110,55,BLACK,FONT0,TRANS,num2);
+ }
+ }else{
+ lcd.drawRectangle(75,34,248,58,0xD6B6,FILL);
+ number=0;
+ }
+ }
+}
+
+/**************************************************/
+/**************************************************/
+//notes application
+void notes(){
+ lcd.imageSD(0,0,"notes"); //load notes design
+ lcd.imageSD(0,0,"WinHead"); //draw header
+ while(1){
+ while(lcd.touchScreen(touch)==0 & lcd.touchIcon(icon)==0); //wait for a touch to do something
+ if(lcd.touchIcon(icon)==1){ //if the received touch was on any icon we exit go to main menu
+ break;
+ }
+ if(touch[YCOORD]>10){
+ lcd.drawCircle(touch[XCOORD],touch[YCOORD],2,BLACK,FILL);
+ }else{
+ if(touch[XCOORD]>300){ //close
+ break;
+ }else{ //reload all
+ lcd.imageSD(0,0,"notes");
+ lcd.imageSD(0,0,"WinHead"); //draw header
+ }
+ }
+ }
+}
+
+/**************************************************/
+/**************************************************/
+//pong application
+void pong(){
+
+ char radiusBall2=8;
+ char radiusBall1=10;
+ int speedBall1=2; //ball1 moving speed - amount of pixels that ball move each time
+ int speedBall2=3; //ball2 moving speed - amount of pixels that ball move each time
+ int dirx1=-1; //xball1 initial negative direction
+ int diry1=1; //yball1 initial positive direction
+ int xBall1=200; //x initial position of ball1
+ int yBall1; //y position of ball1
+ int dirx2=1; //xball2 initial positive direction
+ int diry2=-1; //yball2 initial negative direction
+ int xBall2=50; //x initial position of ball2
+ int yBall2; //y position of ball2
+
+ //variables used by Pong data
+ char score[7]={0,0,' ','P','T','S',0x00}; //array to save score
+ char points=0;
+ char gameOver=0; //game over flag
+ int speedCounter=0; //Counter that saves the speed
+ char ball1Active=1; //acrive ball flag
+ char ball2Active=1; //active ball flag
+ int barSize = 60; //size of bar in pixels
+ int bar=50; //initial x position of the bar
+ int barCenter = (barSize/2)+bar; //we need to know the center of the bar
+ int pongBack=0x6350; //pong background colour
+
+ //define bouncing corners
+ int bottomx1= (25+radiusBall1);
+ int topx1 = (319-25-radiusBall1-1);
+ int bottomy1= (25+radiusBall1);
+ int topy1 = (239-30-radiusBall1-1);
+ int bottomx2= (25+radiusBall2);
+ int topx2 = (319-25-radiusBall2-1);
+ int bottomy2= (25+radiusBall2);
+ int topy2 = (239-30-radiusBall2-1);
+
+ unsigned char i;
+ char buffer[3];
+
+ yBall1=40+radiusBall1; //y initial position of ball1
+ yBall2=160+radiusBall2; //y initial position of ball2
+
+ lcd.imageSD(0,0,"pong"); //load pong design
+ lcd.imageSD(0,0,"WinHead"); //draw header
+ lcd.string(110,100,250,120,GREEN,FONT0,COLOUR,"Touch to Begin"); //draw instructions
+ while(lcd.touchScreen(touch)==0); //wait a touch to begin
+ lcd.drawRectangle(25,25,294,214,pongBack,FILL); //draw arena
+ lcd.drawRectangle(24,24,295,215,GREEN,UNFILL); //corners
+ lcd.drawLine(bar,209,bar+barSize,209,WHITE); //draw Bar
+
+ while(gameOver==0){ //while game over flag is zero
+ buffer[0]=(points/10)+0x30, buffer[1]=(points%10)+0x30, buffer[2]=0; //fill buffer that counts
+ lcd.string(2,16,30,35,RED,FONT3,COLOUR,buffer); //display current points
+ for(i=0;i<5;i++){ //check 5 times if the player touches the screen
+ if(lcd.touchScreen(touch)){ //if we receive a touch then we move the bar to touched side
+ lcd.drawLine(bar,209,bar+barSize,209,pongBack); //erase previous Bar
+ if(touch[XCOORD]>barCenter){ //if we need to move the bar to the right
+ bar+=8; //move the bar to the right 8 pixels
+ if((bar+barSize)>293){ //if the bar reach the right corner
+ bar=293-barSize;
+ }
+ barCenter=bar+(barSize/2); //set new center position of the bar
+ }else{ //move the bar to the left
+ bar-=8; //move the bar to the left 8 pixels
+ if(bar<25){ //if the bar reach the left corner
+ bar=25;
+ }
+ barCenter=bar+(barSize/2); //set new center position of the bar
+ }
+ lcd.drawLine(bar,209,bar+barSize,209,WHITE); //draw the new bar at the new position
+ }
+ }
+ //we update the balls
+ if(ball1Active){ //if we haven't lost the ball1
+ /***************************************************/
+ //This its similar as moveBall1() function of pong example
+ //update the actual position of the ball1
+ lcd.drawCircle(xBall1,yBall1,radiusBall1,pongBack,UNFILL); // Erase previous ball position
+ xBall1+=(dirx1*speedBall1); // Calculate new x coordinate for ball1
+ yBall1+=(diry1*speedBall1); // Calculate new y coordinate for ball1
+ lcd.drawCircle(xBall1,yBall1,radiusBall1,GREEN,UNFILL); // Draw new ball position
+ if((xBall1+speedBall1)>topx1 | (xBall1-speedBall1)<=bottomx1){ // if ball reaches the left or right corner, we invert moving direction
+ dirx1= dirx1*(-1);
+ }
+ if((yBall1+speedBall1)>topy1 | (yBall1-speedBall1)<=bottomy1){ // if ball reaches the top or bottom corner, we invert moving direction
+ if((yBall1-speedBall1)<=bottomy1){ // Bounce on top, only invert moving direction
+ diry1= diry1*(-1); // We invert the moving direction by multiplying by -1
+ }else{ // Bounce on bottom, check if inside the bar
+ if((xBall1+speedBall1)>bar & (xBall1-speedBall1)<(bar+barSize)){ //if bounce inside the bar
+ diry1= diry1*(-1); // We invert the moving direction by multiplying by -1
+ points++; // Increase player current points
+ speedCounter++; // Increase the speed counter
+ if(speedCounter>9){ // If we reach 10 counts we increase the ball1 bouncing speed
+ speedBall1++;
+ speedCounter=0; // Reset the counter
+ }
+ }else{ // Bounce outside the bar
+ ball1Active=0; // Clear ball1 active flag
+ lcd.drawCircle(xBall1,yBall1,radiusBall1,pongBack,UNFILL);// Delete this ball because bounce outside of the bar
+ if(ball1Active==0 & ball2Active==0){ // if we have lost both balls
+ gameOver=1; // Set game over flag
+ }
+ }
+ }
+ }
+ }
+ if(ball2Active){ //if we haven't lost the ball2
+ /***************************************************/
+ //This its similar as moveBall2() function of pong example
+ //update the actual position of the ball2
+ lcd.drawCircle(xBall2,yBall2,radiusBall2,pongBack,FILL); // Erase previous ball position
+ xBall2+=(dirx2*speedBall2); // Calculate new x coordinate for ball2
+ yBall2+=(diry2*speedBall2); // Calculate new y coordinate for ball2
+ lcd.drawCircle(xBall2,yBall2,radiusBall2,MAGENTA,FILL); // Draw new ball position
+ if((xBall2+speedBall2)>topx2 | (xBall2-speedBall2)<=bottomx2){ // if ball reaches the left or right corner, we invert moving direction
+ dirx2= dirx2*(-1);
+ }
+ if((yBall2+speedBall2)>topy2 | (yBall2-speedBall2)<=bottomy2){ // if ball reaches the top or bottom corner, we invert moving direction
+ if((yBall2-speedBall2)<=bottomy2){ // Bounce on top, only invert moving direction
+ diry2= diry2*(-1);
+ }else{ // Bounce on bottom, check if inside the bar
+ if((xBall2+radiusBall2)>bar & (xBall2-radiusBall2)<(bar+barSize)){ //if bounce inside the bar
+ diry2= diry2*(-1); // We invert the moving direction by multiplying by -1
+ points++; // Increase player current points
+ speedCounter++; // Increase the speed counter
+ if(speedCounter>9){ // If we reach 10 counts we increase the ball1 bouncing speed
+ speedBall2++;
+ speedCounter=0; // Reset the counter
+ }
+ }else{ // Bounce outside the bar
+ ball2Active=0; // Clear ball1 active flag
+ lcd.drawCircle(xBall2,yBall2,radiusBall2,pongBack,FILL); // Delete this ball because bounce outside of the bar
+ if(ball1Active==0 & ball2Active==0){ // if we have lost both balls
+ gameOver=1; // Set game over flag
+ }
+ }
+ }
+ }
+ }
+ }
+ //game over - proceed to show final score
+ lcd.string(80,80,272,140,RED,FONT5,TRANS,"Game Over");
+ score[0]=(points/10)+0x30; //convert points to ascii format and store them on the score buffer
+ score[1]=(points%10)+0x30; //convert points to ascii format and store them on the score buffer
+ lcd.string(105,110,272,140,YELLOW,FONT5,TRANS,score);
+ lcd.string(100,135,250,180,GREEN,FONT3,TRANS,"Touch to Exit");
+ wait_ms(1000);
+ while(lcd.touchScreen(touch)==0); //wait for a touch to exit
+}
+
+/**************************************************/
+/**************************************************/
+//slide show application
+void slideShow(){
+ char imagesOnSDCard[8][9]={"Peng320","Koala320","Hydra320","Lig320","Sea320","Tul320","Des320","Flow320"}; //array containing the names of the different called images
+ int pic=0;
+
+ while(1){ //Loop forever in the slide show!
+ lcd.imageSD(0,0,imagesOnSDCard[pic]); //Load image from SD card, all images are 320x240(full screen) so we load them from top left corner X:0,Y:0
+ lcd.imageSD(3,219,"prev"); //Load the prev icon
+ lcd.imageSD(300,219,"next"); //Load the next icon
+ lcd.imageSD(0,0,"WinHead"); //draw header
+
+ while(lcd.touchScreen(touch)==0 & lcd.touchIcon(icon)==0); //wait for a touch to do something
+ if(lcd.touchIcon(icon)==1){ //if the received touch was on any icon we exit go to main menu
+ break;
+ }
+
+ //check if we go to the next image, or to the previous one
+ if(touch[XCOORD]>160){ //if the received touch was on the right middle of the screen we advance the image, else we decrease and go to previous image
+ pic++; //decrease image selector
+ if(pic>7){ //if we reach the position of the last image, we restart to image 0
+ pic=0;
+ }
+ }else{
+ pic--;
+ if(pic<0){ //if we reach the position of the first image, we move to image 7
+ pic=7;
+ }
+ }
+ }
+}
+
+/**************************************************/
+/**************************************************/
+//settings application, brightness adjust
+void settings(){
+ static int bright=127; //Maximum bright is set by default 133 min 14
+ static int buttonCen=271; //button center, static variables to avoid losing the parameters even if we go to main menu
+
+ lcd.imageSD(0,0,"Bright"); //Load image from SD card, image is 320x240(full screen) so we load it from top left corner X:0,Y:0
+ lcd.imageSD(0,0,"WinHead"); //draw header
+
+ while(1){ //Loop forever in the settings!
+ lcd.drawRectangle(40,64,(bright*2)+12,66,0x4C7C,FILL); //draw brightness bar 266 max 40 min
+ lcd.drawRectangle((bright*2)+12,64,266,66,WHITE,FILL); //fill the rest of the bar with white
+ lcd.imageSD((bright*2)+12,57,"button"); //Load the button icon 266 max pos X, 40 min X pos
+ wait_ms(100); //delay to avoid fast change and flickering
+
+ while(lcd.touchScreen(touch)==0 & lcd.touchIcon(icon)==0); //wait for a touch to do something
+ if(lcd.touchIcon(icon)==1){ //if the received touch was on any icon we exit go to main menu
+ break;
+ }
+
+ //touch on Screen, change brightness and draw button icon
+ if(touch[YCOORD]>55 & touch[YCOORD]<85 ){ //if the previous touch was on active area
+ lcd.imageSD((bright*2)+12,57,"clrBar"); //clear the button icon
+
+ //check where to move left or right
+ if(touch[XCOORD]>buttonCen){ //if we need to move the bar to the right
+ bright+=10; //increase the brightness
+ buttonCen+=22; //increase the center of the button
+ if(bright>127){ //if the button reach the right corner
+ bright=127; //set maximum bright
+ buttonCen=271; //set maximum button center
+ }
+ }else{ //move the bar to the left
+ bright-=10; //decrease the brightness
+ buttonCen-=22; //decrease the center of the button
+ if(bright<14){ //if the button reach the left corner
+ bright=14; //set minimum bright
+ buttonCen=40; //set minimum button center
+ }
+ }
+ lcd.bright(bright); //set new brightness value to SMART GPU
+ }
+ }
+}
+
+/**************************************************/
+/**************************************************/
+//google maps application
+void googleMaps(){
+ char mapsOnSDCard[10][9]={"map0","map1","map2","map3","map4","map5","map6","map7","map8","map9"}; //array containing the names of the different called maps
+ char maps=0,nothing=1;
+
+ while(1){ //Loop forever in the slide show!
+ if(nothing!=0){ //do something
+ lcd.imageSD(0,0,mapsOnSDCard[maps]); //Load image from SD card, all images are 320x240(full screen) so we load them from top left corner X:0,Y:0
+ lcd.imageSD(0,0,"WinHead"); //draw header
+ lcd.imageSD(5,25,"barmap"); //draw zoom bar
+ }
+ while(lcd.touchScreen(touch)==0 & lcd.touchIcon(icon)==0); //wait for a touch to do something
+ if(lcd.touchIcon(icon)==1){ //if the received touch was on any icon we exit go to main menu
+ break;
+ }
+
+ if(touch[XCOORD]<25){ //touch on bar
+ if(touch[YCOORD]<120){ //touch on upper side of zoom bar
+ maps++;
+ if(maps>10){
+ maps=10;
+ }
+ }else{ //touch on lower side of zoom bar
+ maps--;
+ if(maps<1){
+ maps=1;
+ }
+ }
+ nothing=1; //prepare to do new image loading
+ }else{ //touch on inactive area
+ nothing=0; //do nothing and get another touch
+ }
+ }
+}
+
+/**************************************************/
+/**************************************************/
+//paint application
+void paint(){
+ unsigned char penSize=1;
+ int colPaint=BLACK;
+ char pen[4]={'x','0','1',0x00}; //Array that show the current penSize
+
+ //Load paint design
+ lcd.imageSD(0,0,"paint"); //load paint image
+ lcd.string(7,54,48,65,GREEN,FONT1,FILL,"Erase"); //draw Erase word
+ lcd.string(77,54,110,65,GREEN,FONT1,FILL,pen); //draw penSize
+ lcd.imageSD(0,0,"WinHead"); //draw header
+
+ while(1){ //Start the Paint application
+ while(lcd.touchScreen(touch)==0 & lcd.touchIcon(icon)==0); //wait for a touch to do something
+ if(lcd.touchIcon(icon)==1){ //if the received touch was on any icon we exit go to main menu
+ break;
+ }
+
+ if(touch[YCOORD]<67){ //the touch was on the menu
+ if(touch[XCOORD]<45){ //touch on erase circle
+ lcd.drawRectangle(0,67,319,239,WHITE,1); //Draw a white rectangle on drawing area
+ }else if(touch[XCOORD]<75){ //touch to select the eraser
+ colPaint=WHITE;
+ lcd.drawCircle(25,34,14,colPaint,FILL); //draw WHITE colour circle on top left corner
+ }else if(touch[XCOORD]<108){ //touch to change pen Size
+ penSize=penSize*2; //double the penSize
+ if(penSize==16){ //maximum pen size = 8, if we reach 16 we set to 1.
+ penSize=1;
+ }
+ pen[1]=(penSize/10)+0x30; //get the tens of penSize and convert them to ascii
+ pen[2]=(penSize%10)+0x30; //get the ones of penSize and convert them to ascii
+ lcd.string(77,54,110,65,GREEN,FONT1,FILL,pen);//draw penSize
+ wait_ms(500); //delay to avoid fast penSize changing
+ }else if(touch[XCOORD]<312 & touch[YCOORD]>20 & touch[YCOORD]<59){ //touch on the colours bar
+ lcd.memoryRead(touch[XCOORD],touch[YCOORD],touch[XCOORD],touch[YCOORD],pixelArray); //assign new colour based on touch coordinates and memory read, this function return a 24 bit pixel array,
+ colPaint=RGB888ToRGB565(pixelArray);
+ lcd.drawCircle(25,34,14,colPaint,FILL); //draw new selected colour on top left corner
+ }
+ }else{ //Touch on drawing area
+ if((touch[YCOORD]-penSize)<67){ // If the touch was very close to the menu, we compensate the radius
+ touch[YCOORD]=touch[YCOORD]+penSize;
+ }
+ lcd.drawCircle(touch[XCOORD],touch[YCOORD],penSize,colPaint,FILL); //Draw
+ }
+ }
+}
+//End of applications
+/**************************************************/
+
+
+/**************************************************/
+/****************** MAIN LOOP *********************/
+/**************************************************/
+/**************************************************/
+/***************************************************/
+int main() {
+ lcd.reset(); //physically reset SMARTGPU
+ lcd.start(); //initialize the SMARTGPU processor
+
+ unsigned char ic;
+
+ lcd.baudChange(2000000); //set high baud for advanced applications
+
+ while(1){
+ //load Desktop
+ lcd.imageSD(0,0,"WinDesk");
+ ic=0;
+
+ while(ic==0){ //loop until we get a click on one application
+ do{
+ while(lcd.touchScreen(touch)==0); //Wait for touch
+ }while(touch[XCOORD]>20 | touch[YCOORD]<220); //Wait for touch on Start Menu
+ //pop up start menu
+ lcd.imageSD(0,8,"WinMenu");
+ while(lcd.touchScreen(touch)==0); //Wait for touch
+ if(touch[XCOORD]<70 & touch[YCOORD]> 8 & touch[YCOORD]< 230){ //If touch on menu
+ ic=((touch[YCOORD]-8)/27)+1; //divide (222pixels/8)=27 and add 1, to get the icon number
+ } //else go back
+ lcd.imageSD(0,0,"MenClose"); //close menu
+ }
+
+ //begin application based on icon number
+ switch(ic){ //now that we know a touch was made on a specified icon:
+ case 1: //case 1 (clock)
+ clocks();
+ break; //end of case 1
+
+ case 2: //case 2 (notes)
+ notes();
+ break; //end of case 2
+
+ case 3: //case 3 (calculator)
+ calculator();
+ break; //end of case 3
+
+ case 4: //case 4 (pong)
+ pong();
+ break; //end of case 4
+
+ case 5: //case 5 (slide show)
+ slideShow();
+ break; //end case 5
+
+ case 6: //case 6 (settings)
+ settings();
+ break; //end case 6
+
+ case 7: //case 7 (paintPro)
+ paint();
+ break; //end of case 7
+
+ case 8: //case 8 (googleMaps)
+ googleMaps();
+ break; //end of case 8
+
+ default: //default for any other case
+ break; //do nothing
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Sep 14 05:37:48 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912