Mini SmartGPU Intelligent Graphics Processor. Mbed library Rev1.0 Vizic Technologies 2012 http://vizictechnologies.com/#/mini-smart-gpu/4566376187

Dependents:   BounceBallMSG BouncingBallsMSG HouseMSG NiceClockMSG ... more

MINISMARTGPU.cpp

Committer:
emmanuelchio
Date:
2012-08-28
Revision:
0:1c3989d263f4
Child:
1:83a75a056cfa

File content as of revision 0:1c3989d263f4:

 /*********************************************************
VIZIC TECHNOLOGIES. COPYRIGHT 2012.
THE DATASHEETS, SOFTWARE AND LIBRARIES ARE PROVIDED "AS IS." 
VIZIC EXPRESSLY DISCLAIM ANY WARRANTY OF ANY KIND, WHETHER 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
OR NONINFRINGEMENT. IN NO EVENT SHALL VIZIC BE LIABLE FOR 
ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, 
LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF 
PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, 
ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO 
ANY DEFENCE THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION,
OR OTHER SIMILAR COSTS.
*********************************************************/

#include "mbed.h"
#include "MINISMARTGPU.h"
        
// MINI SMART GPU DEFAULT BAUD RATE: 9600bps
//It shoud be used like this : MINISMARTGPU lcd(p13,p14,p15); for serial communication with MINISMARTGPU
MINISMARTGPU::MINISMARTGPU(PinName TXPin, PinName RXPin, PinName resetPin): _serialMINISMARTGPU(TXPin,RXPin), _resetPin(resetPin){    
    init();
}

/********** high level commands, for the user! */
void MINISMARTGPU::init(){         //configure the mbed for MINISMARTGPU board    
    _serialMINISMARTGPU.baud(9600);
    _resetPin=1;               //set the pin to 3.3v to avoid reset 
}
 
void MINISMARTGPU::reset(){        //Reset the MINISMARTGPU board
    _resetPin=0;               //set the pin to GND to reset 
    wait_ms(500);
    _resetPin=1;               //set the pin to 3.3v to end reset
    wait_ms(500);    

}

unsigned char MINISMARTGPU::start(){           //Init the MINISMARTGPU
  wait_ms(500); 
  _serialMINISMARTGPU.putc('U');  
  wait_ms(1500);
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::erase(){          //Erase the MINISMARTGPU screen
  _serialMINISMARTGPU.putc('E');  
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::sleep(unsigned char mode){       //Send MINISMARTGPU to sleep mode
  _serialMINISMARTGPU.putc('Z'); 
  _serialMINISMARTGPU.putc(mode);
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::orientation(unsigned char side){       //Change display orientation
  _serialMINISMARTGPU.putc('O'); 
  _serialMINISMARTGPU.putc(side);
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::bright(unsigned char val){       //Change display brightness
  _serialMINISMARTGPU.putc('V'); 
  _serialMINISMARTGPU.putc(val); 
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::baudChange(unsigned long val){       //Change baud rate of mbed and SMARTGPU board
  unsigned char aux;

  switch(val){
    case 9600:
      aux=0;
    break;
    case 19200:
      aux=1;
    break;
    case 57600:
      aux=2;
    break;
    case 115200:
      aux=3;
    break;
    case 256000:
      aux=4;
    break;    
    case 500000:
      aux=5;
    break;
    case 1000000:
      aux=6;
    break;
    case 2000000:
      aux=7;
    break;
    default:
      return 'F';

  } 
  _serialMINISMARTGPU.putc('X');
  _serialMINISMARTGPU.putc(aux);  
  aux=_serialMINISMARTGPU.getc();

  if(aux=='O'){
    wait_ms(150);
    _serialMINISMARTGPU.baud(val);
    wait_ms(200);
    return _serialMINISMARTGPU.getc();
  }else{
    return aux;
  }
}

unsigned char MINISMARTGPU::setScreenBackground(int colour){       //Change the default screen background colour for erase function
  _serialMINISMARTGPU.putc('B'); 
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);  
  return _serialMINISMARTGPU.getc();
  
}

unsigned char MINISMARTGPU::setTextBackground(int colour){       //Set the default text background colour for letters and strings
  _serialMINISMARTGPU.putc('A'); 
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);  
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::memoryRead(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, char buffer[]){ //Read the internal memory of the MINISMARTGPU, This command returns 24bit pixels (3 bytes)
  unsigned int i,j,k=0;
  
  _serialMINISMARTGPU.putc('M'); 
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2); 

  //receive all the pixels
  for(j=0;j<=(y2-y1);j++){
    for(i=0;i<=(x2-x1);i++){
        buffer[k]=_serialMINISMARTGPU.getc(); //Red
        k++;
        buffer[k]=_serialMINISMARTGPU.getc(); //Green
        k++;
        buffer[k]=_serialMINISMARTGPU.getc(); //Blue
        k++;
    }    
  } 
  return _serialMINISMARTGPU.getc();  

}

unsigned char MINISMARTGPU::putPixel(unsigned char x, unsigned char y, int colour){       //Draw a pixel on the screen
  _serialMINISMARTGPU.putc('P'); 
  _serialMINISMARTGPU.putc(x);
  _serialMINISMARTGPU.putc(y);
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::drawLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, int colour){       //Draw a line on the screen
  _serialMINISMARTGPU.putc('L'); 
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2);  
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::drawRectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, int colour, unsigned char fill){       //Draw a rectangle on the screen
  _serialMINISMARTGPU.putc('R');  
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2);  
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  _serialMINISMARTGPU.putc(fill);   
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::drawTriangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char x3, unsigned char y3, int colour, unsigned char fill){       //Draw a triangle on the screen
  _serialMINISMARTGPU.putc('T'); 
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2);  
  _serialMINISMARTGPU.putc(x3);
  _serialMINISMARTGPU.putc(y3);    
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  _serialMINISMARTGPU.putc(fill);   
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::drawCircle(unsigned char x, unsigned char y, unsigned char radius, int colour, unsigned char fill){       //Draw a circle on the screen
  _serialMINISMARTGPU.putc('C'); 
  _serialMINISMARTGPU.putc(x);
  _serialMINISMARTGPU.putc(y);
  _serialMINISMARTGPU.putc(radius);
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  _serialMINISMARTGPU.putc(fill);   
  return _serialMINISMARTGPU.getc();
  
}

unsigned char MINISMARTGPU::putLetter(unsigned char x, unsigned char y, int colour, unsigned char font, unsigned char fill, unsigned char letter){       //Draw a letter on the screen
  _serialMINISMARTGPU.putc('W'); 
  _serialMINISMARTGPU.putc(x);
  _serialMINISMARTGPU.putc(y);
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  _serialMINISMARTGPU.putc(font); 
  _serialMINISMARTGPU.putc(fill); 
  _serialMINISMARTGPU.putc(letter);  
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::string(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, int colour, unsigned char font, unsigned char fill, char text[]){       //Draw a string on the screen
  int counter=0;
  
  _serialMINISMARTGPU.putc('S'); 
  _serialMINISMARTGPU.putc('N'); //not SD
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2);  
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  _serialMINISMARTGPU.putc(font); 
  _serialMINISMARTGPU.putc(fill); 
  while(1){
    _serialMINISMARTGPU.putc(text[counter]);
    if(text[counter]==0x00){
      break;
    }    
    counter++;
  } 
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::stringSD(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, int colour, unsigned char font, unsigned char fill, int BS, int BR, char name[]){       //Draw a String from a text file contained on the micro SD card on the screen
  unsigned char counter=0;
  
  _serialMINISMARTGPU.putc('S'); 
  _serialMINISMARTGPU.putc('S'); //from SD
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2);  
  _serialMINISMARTGPU.putc(colour>>8);
  _serialMINISMARTGPU.putc(colour);
  _serialMINISMARTGPU.putc(font); 
  _serialMINISMARTGPU.putc(fill); 
  _serialMINISMARTGPU.putc(BS>>8);
  _serialMINISMARTGPU.putc(BS);  
  _serialMINISMARTGPU.putc(BR>>8);
  _serialMINISMARTGPU.putc(BR);  
  while(1){
    _serialMINISMARTGPU.putc(name[counter]);
    if(name[counter]==0x00){
      break;
    }    
    counter++;
  }
  return _serialMINISMARTGPU.getc();

}

unsigned char MINISMARTGPU::icon(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, char icon[]){            //Send and image or icon pixel by pixel to MINISMARTGPU, 16bit(2 bytes) each pixel RGB565
  unsigned int i,j,k=0; 
  
  _serialMINISMARTGPU.putc('I'); 
  _serialMINISMARTGPU.putc('N'); //not SD
  _serialMINISMARTGPU.putc(x1);
  _serialMINISMARTGPU.putc(y1);
  _serialMINISMARTGPU.putc(x2);
  _serialMINISMARTGPU.putc(y2);
  
  //Send icon buffer pixel by pixel
  for(j=0;j<=(y2-y1);j++){
    for(i=0;i<=(x2-x1);i++){
        _serialMINISMARTGPU.putc(icon[k]);
        k++;
    }
  } 
  return _serialMINISMARTGPU.getc();  

}

unsigned char MINISMARTGPU::imageSD(unsigned char x, unsigned char y, char name[]){        //Draw an Image contained on the micro SD card on the screen, top left corner coordinates
  unsigned char counter=0;
  
  _serialMINISMARTGPU.putc('I'); 
  _serialMINISMARTGPU.putc('S'); //from SD
  _serialMINISMARTGPU.putc(x>>8); 
  _serialMINISMARTGPU.putc(x);
  _serialMINISMARTGPU.putc(y>>8);
  _serialMINISMARTGPU.putc(y);
  
  while(1){
    _serialMINISMARTGPU.putc(name[counter]);
    if(name[counter]==0x00){
      break;
    }    
    counter++;
  }
  return _serialMINISMARTGPU.getc();

}

/****************************************************************/
//Those next functions return file execution status instead of ACK 'O' or NAK 'F'
/****************************************************************/

unsigned char MINISMARTGPU::SDfopen(unsigned char mode, char name[]){
  unsigned char counter=0;
  unsigned char aux = 0;
  
  wait_ms(1);
  _serialMINISMARTGPU.putc('F'); //memory card file management
  _serialMINISMARTGPU.putc('O'); //file open
  _serialMINISMARTGPU.putc(mode);
  while(1){
	_serialMINISMARTGPU.putc(name[counter]);
    if(name[counter]==0x00){
      break;
	}	
	counter++;
  }
  aux= _serialMINISMARTGPU.getc();   //Get FAT result
  _serialMINISMARTGPU.getc();        //Discard 'O' or 'F'
  return aux;                        //Return FAT result
}

unsigned char MINISMARTGPU::SDfclose(){
  unsigned char aux = 0;

  wait_ms(5);
  _serialMINISMARTGPU.putc('F'); //memory card file management
  _serialMINISMARTGPU.putc('C'); //file close
  
  aux= _serialMINISMARTGPU.getc();   //Get FAT result
  _serialMINISMARTGPU.getc();        //Discard 'O' or 'F'
  return aux;                        //Return FAT result
}

unsigned char MINISMARTGPU::SDfsync(){
  unsigned char aux = 0;
  
  _serialMINISMARTGPU.putc('F'); //memory card file management
  _serialMINISMARTGPU.putc('S'); //file sync

  aux= _serialMINISMARTGPU.getc();   //Get FAT result
  _serialMINISMARTGPU.getc();        //Discard 'O' or 'F'
  return aux;                        //Return FAT result
}

unsigned char MINISMARTGPU::SDfpointer(unsigned long position){
  unsigned char aux = 0;
  
  _serialMINISMARTGPU.putc('F'); //memory card file management
  _serialMINISMARTGPU.putc('P'); //file sync
  _serialMINISMARTGPU.putc(position>>24);
  _serialMINISMARTGPU.putc(position>>16);
  _serialMINISMARTGPU.putc(position>>8);
  _serialMINISMARTGPU.putc(position);
  
  aux= _serialMINISMARTGPU.getc();   //Get FAT result
  _serialMINISMARTGPU.getc();        //Discard 'O' or 'F'
  return aux;                        //Return FAT result 
}	

unsigned char MINISMARTGPU::SDfread(unsigned int BTR, char buffer[], unsigned int *SRB){ //Bytes to Read, Read Buffer, Succesfully Readed Bytes
  unsigned char aux = 0;
  unsigned int x=0, sr=0;

  _serialMINISMARTGPU.putc('F'); //memory card file management
  _serialMINISMARTGPU.putc('R'); //file read
  _serialMINISMARTGPU.putc(BTR>>8);
  _serialMINISMARTGPU.putc(BTR);  
  for(x=0;x<BTR;x++){
	buffer[x]=_serialMINISMARTGPU.getc();
  }
  sr=_serialMINISMARTGPU.getc();
  sr=sr<<8;
  sr|=_serialMINISMARTGPU.getc();
 
  aux= _serialMINISMARTGPU.getc();   //Get FAT result
  _serialMINISMARTGPU.getc();        //Discard 'O' or 'F'
  *SRB = sr;
  return aux;                        //Return FAT result
}	

unsigned char MINISMARTGPU::SDfwrite(unsigned int BTW, char buffer[], unsigned int *SWB){ //Bytes to Write, Write Buffer, Succesfully Written Bytes
  unsigned char aux = 0;
  unsigned int x=0, sw=0;
  
  wait_ms(1);
  if(BTW>512){       //Mini SmartGPU accept to write more than 512 bytes, however this is not recommended, remove this IF for fully write support
	aux = 19;        //Invalid Parameter == 19
  }else{
	_serialMINISMARTGPU.putc('F'); //memory card file management
	_serialMINISMARTGPU.putc('W'); //file write
	_serialMINISMARTGPU.putc(BTW>>8);
	_serialMINISMARTGPU.putc(BTW);    
	for(x=0;x<BTW;x++){
		_serialMINISMARTGPU.putc(buffer[x]);
	}
	sw=_serialMINISMARTGPU.getc();
	sw=sw<<8;
	sw|=_serialMINISMARTGPU.getc();
 
	aux= _serialMINISMARTGPU.getc();   //Get FAT result
	_serialMINISMARTGPU.getc();        //Discard 'O' or 'F'
	*SWB = sw;  
  }
  return aux;           //Return FAT result   
}