/*
 * nlcd.h
 *
 *  Created on: 21. mar. 2018
 *      Author: Gregor Slemensek
 */

#ifndef NLCD_H_
#define NLCD_H_

#include "main.h"
#include "stm32l476g_discovery.h"

#define	COMMAND	0
#define	DATA		1

#define		NOP					0x00	//no operation
#define		SWRESET			0x01	//Software reset
#define		BSTROFF			0x02	//Booster voltage off
#define		BSTRON			0x03	//Booster voltage on
#define		RDDIDIF			0x04	//not used -> write only display
#define		RDDST				0x09	//not used -> write only display
#define		Sleep_IN		0x10	//Sleep in
#define		Sleep_OUT		0x11	//Sleep out
#define		PTLON				0x12	//Partial mode on
#define		NORON				0x13	//Normal display mode ON
#define		INVOFF			0x20	//Display inversion off
#define		INVON				0x21	//Display inversion on
#define		DALO				0x22	//All pixel off
#define		DAL					0x23	//All pixel on
#define		SETCON			0x25	//Set contrast, followed by 0x3F max value
#define		DISPOFF			0x28	//Display off
#define		DISPON			0x29	//Display on
#define		CASET				0x2A	//Column address set, followed by two bytes address starts and address end -> x
#define		PASET				0x2B	//Page address set, followed by two bytes address starts and address end -> y
#define		RAMWR				0x2C	//RAM Write Command, followed by color data
#define		RGBSET			0x2D	//Color set TODO
#define		PTLAR				0x30	//Partial area, followed by two bytes, partial area start address and stop address
#define		VSCRDEF			0x33	//Vertical scroll definition, followed by 3 bytes
#define		TEOFF				0x34	//Tearing line off
#define		TEON				0x35	//Tearing line on
#define		MADCTL			0x36	//Memory data access control, followed by 1 byte of data
#define		SEP					0x37	//Set scroll entry point, followed by 1 byte of data
#define		IDMOFF			0x38	//Idle mode off
#define		ODMON				0x39	//Idle mode on
#define		COLMOD			0x3A	//Interface pixel format, followed by 1 byte of data
#define		SETVOP			0xB0	//Set Vop, followed by 2 bytes of data
#define		BRS					0xB4	//Bottom row swap
#define		TRS					0xB6	//Top row swap
#define		FINV				0xB9	//Super frame inversion
#define		DOR					0xBA	//Data order
#define		TCDFE				0xBD	//Enable/disable DF temp comp
#define		TCVOPE			0xBF	//Enable/disable	Vop temp comp
#define		EC					0xC0	//Internal or external oscillator
#define		SETMUL			0xC2	//Set multiplication factor
#define		TCVOPAB			0xC3	//Set TCVOP slopes A and B
#define		TCVOPCD			0xC4	//Set TCVOP slopes C and D
#define		TCDF				0xC5	//Set divider frequency
#define		DF8Color		0xC6	//Set divider frequency 8-color mode
#define		SETBS				0xC7	//Set bias system
#define		RDTEMP			0xC8	//Temperature read back
#define		NLI					0xC9	//N-line inversion
#define		RDID1				0xDA	//Read ID1
#define		RDID2				0xDB	//Read ID2
#define		RDID3				0xDC	//Read ID3
#define		SFD					0xEF	//Set factory defaults
#define		ECM					0xF0	//Set calibration control settings
#define		OTPSHTIN		0xF1	//Shift data in OTP shift registers

#define PCF8833
//#define S1D15G00

#define	CS_LOW			HAL_GPIO_WritePin(NLCD_CS_GPIO_Port, NLCD_CS_Pin, GPIO_PIN_RESET)
#define	CS_HIGH			HAL_GPIO_WritePin(NLCD_CS_GPIO_Port, NLCD_CS_Pin, GPIO_PIN_SET)
#define	RESET_LOW		HAL_GPIO_WritePin(NLCD_RESET_GPIO_Port, NLCD_RESET_Pin, GPIO_PIN_RESET)
#define	RESET_HIGH	HAL_GPIO_WritePin(NLCD_RESET_GPIO_Port, NLCD_RESET_Pin, GPIO_PIN_SET)
#define	CLK_LOW			HAL_GPIO_WritePin(NLCD_CLK_GPIO_Port, NLCD_CLK_Pin, GPIO_PIN_RESET)
#define	CLK_HIGH		HAL_GPIO_WritePin(NLCD_CLK_GPIO_Port, NLCD_CLK_Pin, GPIO_PIN_SET)
#define	SDA_LOW			HAL_GPIO_WritePin(NLCD_SDA_GPIO_Port, NLCD_SDA_Pin, GPIO_PIN_RESET)
#define	SDA_HIGH		HAL_GPIO_WritePin(NLCD_SDA_GPIO_Port, NLCD_SDA_Pin, GPIO_PIN_SET)

void NLCDWriteCommand(unsigned char data)
{
	unsigned char TxD[2];
	TxD[0] = data;
	TxD[1] = COMMAND;
	//CS_LOW;
	HAL_SPI_Transmit(&hspi1, TxD, 1, 10);
	//CS_HIGH;
}

void NLCDWriteData(unsigned char data)
{
	unsigned char TxD[2];
	TxD[0] = data;
	TxD[1] = DATA;
	//CS_LOW;
	HAL_SPI_Transmit(&hspi1, TxD, 1, 10);
	//CS_HIGH;
}

void NLCD_Init(void)
{
	RESET_LOW;
	HAL_Delay(20);
	RESET_HIGH;
	HAL_Delay(20);
	//trig();
	CS_LOW;
	NLCDWriteCommand(SFD); //Sleep Out
	CS_HIGH;
	CS_LOW;
	NLCDWriteCommand(Sleep_OUT); //Sleep Out
	CS_HIGH;
	CS_LOW;
	NLCDWriteCommand(INVON); //Inversion On
	CS_HIGH;
	CS_LOW;
	NLCDWriteCommand(COLMOD);
	NLCDWriteData(0x05);
	CS_HIGH;
	CS_LOW;
	NLCDWriteCommand(MADCTL);
	NLCDWriteData(0xC8);
	CS_HIGH;
	CS_LOW;
	NLCDWriteCommand(SETCON);
	NLCDWriteData(0x30);
	HAL_Delay(20);
	CS_HIGH;
	CS_LOW;
	NLCDWriteCommand(DISPON);
	CS_HIGH;
}

void trig(void)
{
	HAL_GPIO_WritePin(TRIGGER_GPIO_Port, TRIGGER_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(TRIGGER_GPIO_Port, TRIGGER_Pin, GPIO_PIN_RESET);
}

#endif /* NLCD_H_ */
