SMARTGPU Ipod like demo! Be sure to load images to micro SD card first!

Dependencies:   SMARTGPU mbed

Revision:
0:26a6123c8cd4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 14 05:32:37 2011 +0000
@@ -0,0 +1,742 @@
+/**************************************************************************************/
+/*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.drawRectangle(0,0,319,14,0x9CB2,1);             //draw upper bar
+    lcd.imageSD(10,2,"battery");                        //draw image of battery
+    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
+     
+      //this is recommended to be replaced by the ticker interrupt and just wait for a touch!
+      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.drawRectangle(0,0,319,14,0x9CB2,1);            //draw upper bar
+  lcd.imageSD(10,2,"battery");                       //draw battery icon
+  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.drawRectangle(0,0,319,14,0x9CB2,FILL);  //draw upper bar
+  lcd.imageSD(10,2,"battery");                //draw battery
+  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]>66){ 
+      lcd.drawCircle(touch[XCOORD],touch[YCOORD],2,BLACK,FILL);
+    }else{
+      if(touch[XCOORD]<61){
+        break;
+      }else if(touch[XCOORD]>280){            //reload all
+        lcd.imageSD(0,0,"notes");
+        lcd.drawRectangle(0,0,319,14,0x9CB2,FILL);
+        lcd.imageSD(10,2,"battery");             
+      }
+    }                                 
+ }                                 
+}
+
+/**************************************************/
+/**************************************************/
+//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.drawRectangle(0,0,319,14,0x9CB2,FILL);                             //draw bar
+  lcd.imageSD(10,2,"battery");                                           //draw battery
+  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.drawRectangle(0,0,319,14,0x9CB2,FILL); //draw upper bar
+    lcd.imageSD(10,2,"battery");               //draw battery    
+       
+    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.drawRectangle(0,0,319,14,0x9CB2,FILL);                 //draw upper bar
+    lcd.imageSD(10,2,"battery");                               //draw battery  
+    
+  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.drawRectangle(0,0,319,14,0x9CB2,FILL); //draw upper bar
+      lcd.imageSD(10,2,"battery");               //draw battery
+      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.drawRectangle(0,0,319,14,0x9CB2,FILL);          //draw upper bar
+  lcd.imageSD(10,2,"battery");                        //draw battery  
+  
+   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 menu and bar
+    lcd.imageSD(0,0,"IpMenu");   
+    lcd.drawRectangle(0,0,319,14,0x9CB2,1);
+    lcd.imageSD(10,2,"battery"); 
+    
+    //wait for a touch on screen to do something
+    while(lcd.touchScreen(touch)==0);   
+    
+    //obtain icon number
+    if(touch[XCOORD]<84){       //if X coordinate is less than 84
+      ic=1;      
+    }else if(touch[XCOORD]<160){//if X coordinate is less than 160
+      ic=2;
+    }else if(touch[XCOORD]<235){//if X coordinate is less than 235
+      ic=3;      
+    }else{                      //then X coordinate is between 235-319
+      ic=4;
+    }  
+    if(touch[YCOORD]>128){      //if Y is greater than 134, touch was on the bottom half of the screen
+      ic=ic+4;
+    }
+    
+    //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 (calculator)
+        calculator();  
+      break;                    //end of case 2 
+
+      case 3:                   //case 3 (notes) 
+        notes();
+      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 (googleMaps)
+        googleMaps();                 
+      break;                    //end of case 7 
+
+      case 8:                   //case 8 (paintPro)
+        paint();             
+      break;                    //end of case 8
+      
+      default:                  //default for any other case
+      break;                    //do nothing
+    } 
+  }  
+}
\ No newline at end of file