/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is property of Nordic Semiconductor ASA.
 * Terms and conditions of usage are described in detail in NORDIC
 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
 *
 * Licensees are granted free, non-transferable use of the information. NO
 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
 * the file.
 *
 */

/** @file
* @defgroup spi_master_example_main main.c
* @{
* @ingroup spi_master_example
*
* @brief SPI Master Loopback Example Application main file.
*
* This file contains the source code for a sample application using SPI.
*
*/

#include "spi_master.h"
#include "nrf_delay.h"
#include "common.h"
#include "spi_master_config.h"
#include "nrf_gpio.h"

static uint8_t tx_data[TX_RX_MSG_LENGTH]; /**< SPI TX buffer. */
static uint8_t rx_data[TX_RX_MSG_LENGTH]; /**< SPI RX buffer. */

#define DELAY_MS               100        /**< Timer Delay in milli-seconds. */


#define WHITE          0xFFFF
#define BLACK          0x0000
#define BLUE           0x001F
#define BLUE2          0x051F
#define RED            0xF800
#define MAGENTA        0xF81F
#define GREEN          0x07E0
#define CYAN           0x7FFF
#define YELLOW         0xFFE0
#define ORANGE		   0xF900 


void delay(unsigned int time)
{
    unsigned int  i;
	unsigned char j;

	for(i=0;i<time;i++)
		for(j=0;j<250;j++);
}

void write_com(unsigned char com_WR)
{
	uint8_t rx_data[2];
	
	
	spi_master_tx_rx(SPI0, 1, &com_WR, &rx_data[0]);
	

}

void  write_ctrl_data(unsigned char data_WR)
{
		uint8_t rx_data[2];

	spi_master_tx_rx(SPI0, 1, &data_WR, &rx_data[0]); 
}

void TFT_init(void)
{
 
	
  nrf_gpio_pin_set(2);  
    delay(100);
 	write_com(0x11);				//Sleep out
	delay(120);
	
	//ST7735R Frame Rate
	write_com(0xB1);
	write_ctrl_data(0x01);
	write_ctrl_data(0x2C);
	write_ctrl_data(0x2D);
	write_com(0xB2);
	write_ctrl_data(0x01);
	write_ctrl_data(0x2C);
	write_ctrl_data(0x2D);
	write_com(0xB3);
	write_ctrl_data(0x01);
	write_ctrl_data(0x2C);
	write_ctrl_data(0x2D);
	write_ctrl_data(0x01);
	write_ctrl_data(0x2C);
	write_ctrl_data(0x2D);


	write_com(0xB4);			//Column inveTFT_RSion
	write_ctrl_data(0x07);
	
	
	//ST7735R Power Sequence
	write_com(0xC0);
	write_ctrl_data(0xA2);
	write_ctrl_data(0x02);
	write_ctrl_data(0x84);
	write_com(0xC1);
	write_ctrl_data(0xC5);
	write_com(0xC2);
	write_ctrl_data(0x0A);
	write_ctrl_data(0x00);
	write_com(0xC3);
	write_ctrl_data(0x8A);
	write_ctrl_data(0x2A);
	write_com(0xC4);
	write_ctrl_data(0x8A);
	write_ctrl_data(0xEE);

	write_com(0xC5);			//VCOM
	write_ctrl_data(0x0E);

	//Display Mode vertical/horizontal
	write_com(0x36);
	#ifdef TFT_VERTICAL 
			write_ctrl_data(0xC8);
	#else	
			write_ctrl_data(0xA8);
	#endif

    //ST7735R Gamma Sequence
	write_com(0xe0);
	write_ctrl_data(0x02);
	write_ctrl_data(0x1c);
	write_ctrl_data(0x07);
	write_ctrl_data(0x12);
	write_ctrl_data(0x37);
	write_ctrl_data(0x32);
	write_ctrl_data(0x29);
	write_ctrl_data(0x2d);
	write_ctrl_data(0x29);
	write_ctrl_data(0x25);
	write_ctrl_data(0x2b);
	write_ctrl_data(0x39);
	write_ctrl_data(0x00);
	write_ctrl_data(0x01);
	write_ctrl_data(0x03);
	write_ctrl_data(0x10);
	write_com(0xe1);
	write_ctrl_data(0x03);
	write_ctrl_data(0x1d);
	write_ctrl_data(0x07);
	write_ctrl_data(0x06);
	write_ctrl_data(0x2e);
	write_ctrl_data(0x2c);
	write_ctrl_data(0x29);
	write_ctrl_data(0x2d);
	write_ctrl_data(0x2e);
	write_ctrl_data(0x2e);
	write_ctrl_data(0x37);
	write_ctrl_data(0x3f);
	write_ctrl_data(0x00);
	write_ctrl_data(0x00);
	write_ctrl_data(0x02);
	write_ctrl_data(0x10);

	#ifdef TFT_VERTICAL 
		write_com(0x2A);	      
		write_ctrl_data(0x00);
		write_ctrl_data(0x02);	  
		write_ctrl_data(0x00);
		write_ctrl_data(0x81);	  
		
		write_com(0x2B);		  
		write_ctrl_data(0x00);
		write_ctrl_data(0x01);	 
		write_ctrl_data(0x00);
		write_ctrl_data(0xA0);	
	#else	
		write_com(0x2A); 
		write_ctrl_data(0x00);
		write_ctrl_data(0x00);  
		write_ctrl_data(0x00);  
		write_ctrl_data(0x9F);
	
		write_com(0x2B); 
		write_ctrl_data(0x00);
		write_ctrl_data(0x00);  
		write_ctrl_data(0x00);  
		write_ctrl_data(0x7F);
	#endif  
    
	delay(10);

    write_com(0x3A); 
    write_ctrl_data(0x05);  
	//write_com(0x3A);				//65k mode
	//write_ctrl_data(0x05);
	write_com(0x29);				//Display on
	write_com(0x2C);
}

void address_set(unsigned char postion_x,unsigned char postion_y,unsigned char postion_x1,unsigned char postion_y1)
{
	write_com(0x2A);	      		   //Column address set
	write_ctrl_data(0x00);
	write_ctrl_data(postion_x);	  	   //Starting co-ordinate of  x
	write_ctrl_data(0x00);
	write_ctrl_data(postion_x1);	   //End co-ordinate of  x
	
	write_com(0x2B);		  			//Row address set
	write_ctrl_data(0x00);				
	write_ctrl_data(postion_y);	  		//Starting co-ordinate of   y
	write_ctrl_data(0x00);
	write_ctrl_data(postion_y1);	  	 //End co-ordinate of  y
	
	write_com(0x2C);	
}

void write_dat(unsigned int data_WR)
{
	write_ctrl_data(data_WR>>8);
	write_ctrl_data(data_WR&0x00FF);
}

void TFT_Clear_Screen(unsigned short color)
{
	unsigned char i,j;
	#ifdef TFT_VERTICAL									   //for Vertical Mode
			address_set(0,0,130,165);					   //Set area on GRAM
	#else												   //for Horizontal Mode
			address_set(0,0,165,130);						//Set area on GRAM
	#endif

 	for (i=0;i<164;i++)
    	for (j=0;j<131;j++)
        	write_dat(color);
}

void TFT_Rectangle( unsigned short postion_x, unsigned short postion_y, unsigned short postion_x1, unsigned short postion_y1, unsigned short dat ) 
{
	int i,j;

	address_set(postion_x,postion_y,postion_x1,postion_y1);			  //Set area on GRAM

  	write_com(0x2c); 												  //Memory write

	delay(10);
	for(i=0;i<=(postion_x1 - postion_x);i++)
		for(j=0;j<=(postion_y1 - postion_y);j++) 
		{
			write_ctrl_data(dat>>8);
			delay(10);
			write_ctrl_data(dat);
		}

	
}





/** @brief Function for main application entry.
 */
int main(void)
{
	/*RST pin*/
//	NRF_GPIO->PIN_CNF[3]=1;
//	nrf_gpio_pin_set(3);
	
	/* RS pin*/
//	NRF_GPIO->PIN_CNF[1]=1;
//	nrf_gpio_pin_set(1);
	
	/* BLpin*/
//	NRF_GPIO->PIN_CNF[5]=1;
//	nrf_gpio_pin_set(5);
	
	
	
   spi_master_init(SPI0, SPI_MODE0, false);
	
	 TFT_init();	
	
	while(1)
	{
		TFT_Clear_Screen(WHITE);
		TFT_Rectangle(5,5,55,55,BLUE);
	//	TFT_PutString(10,15," WELCOME ",2,BLACK ,CYAN);	
		
		delay(5000);
	}
	
}
/** @} */
