/*
 * OLED_SSD1327.h
 *
 *  The MIT License.
 *  Created on: 16.07.2020
 *      Author: Mateusz Salamon
 *      www.msalamon.pl
 *      mateusz@msalamon.pl
 */

#ifndef OLED_SSD1327_H_
#define OLED_SSD1327_H_

/*
 *
 *    SETTINGS
 *
 *    Please set only one interface. It won't work with both one time.
 *
 */
//#define SSD1327_SPI_CONTROL
#define SSD1327_I2C_CONTROL

#ifdef SSD1327_I2C_CONTROL
//#define SSD1327_I2C_DMA_ENABLE
#define SSD1327_I2C_ADDRESS   (0x3D << 1)
#endif
#ifdef SSD1327_SPI_CONTROL
#define SSD1327_RESET_USE
#define SSD1327_SPI_DMA_ENABLE
#define SPI_CS_HARDWARE_CONTROL
#endif

//
// Resolution
//
#define SSD1327_LCDWIDTH                  128
#define SSD1327_LCDHEIGHT                 128 //96

/*
 * 		Please set what functionality you want to use.
 * 		Some functions need other functionalities. It should works automatically.
 *
 * 		1 - will be compiled
 * 		0 - won't be compiled
 */
#define GRAPHIC_ACCELERATION_COMMANDS 0

/****************************************************************/

//
// Commands
//
/*
 Эта трёхбайтовая команда определяет начальный и конечный адреса столбцов 
в ОЗУ данных отображения. Эта
команда также устанавливает указатель адреса столбца на начальный адрес столбца.
 Этот указатель используется для определения
текущего адреса столбца для чтения/записи в ОЗУ данных графического отображения. 
 Если режим горизонтального увеличения адреса включён командой A0h, после 
завершения чтения/записи данных одного столбца он автоматически увеличивается до
адреса следующего столбца. Всякий раз, когда указатель адреса столбца завершает 
доступ к адресу конечного столбца, он сбрасывается обратно на адрес начального 
столбца, а адрес строки увеличивается до следующей строки.
*/
#define SSD1327_SETCOLUMNADDRESS	0x15


#define SSD1327_SETROWADDRESS		0x75
#define SSD1327_SETCONTRASTCURRENT 	0x81
#define SSD1327_NOP					0x84
#define SSD1327_SEGREMAP			0xA0
#define SSD1327_SETDISPLAYSTARTLINE	0xA1
#define SSD1327_SETDISPLAYOFFSET	0xA2
#define SSD1327_DISPLAYALLON_RESUME 0xA4
#define SSD1327_DISPLAYALLON 		0xA5
#define SSD1327_NORMALDISPLAY 		0xA6
#define SSD1327_INVERTDISPLAY 		0xA7
#define SSD1327_SETMULTIPLEX		0xA8
#define SSD1327_FUNCTIONSELECTIONA	0xAB
#define SSD1327_DISPLAYOFF			0xAE
#define SSD1327_DISPLAYON			0xAF
#define SSD1327_SETPHASELENGTH		0xB1
#define SSD1327_SETFRONTCLOCKDIVIDER_OSCILLATORFREQUENCY 0xB3
#define SSD1327_SETGPIO				0xB5
#define SSD1327_SETSECONDPRECHARGEPERTIOD	0xB6
#define SSD1327_SETGRAYSCALETABLE	0xB8
#define SSD1327_SELECTDEFAULTLINEARGRAYSCALETABLE	0xB9
#define SSD1327_SETPRECHARGEVOLTAGE	0xBC
#define SSD1327_SETSETVCOMVOLTAGE	0xBE
#define SSD1327_FUNCTIONSELECTIONB	0xD5
#define SSD1327_SETCOMMANDLOCK		0xFD

//
// Scrolling #defines
//
#define SSD1327_ACTIVATE_SCROLL			0x2F
#define SSD1327_DEACTIVATE_SCROLL		0x2E
#define SSD1327_RIGHT_HORIZONTAL_SCROLL	0x26
#define SSD1327_LEFT_HORIZONTAL_SCROLL	0x27

//
// Colors
//
#define BLACK 0
// Grays between
#define WHITE 15

//
// Scrolling enums
//
typedef enum
{
	SCROLL_EVERY_5_FRAMES,
	SCROLL_EVERY_64_FRAMES,
	SCROLL_EVERY_128_FRAMES,
	SCROLL_EVERY_256_FRAMES,
	SCROLL_EVERY_3_FRAMES,
	SCROLL_EVERY_4_FRAMES,
	SCROLL_EVERY_25_FRAMES,
	SCROLL_EVERY_2_FRAMES,
} scroll_horizontal_speed;
//
// Functions
//
#ifdef SSD1327_I2C_CONTROL
void SSD1327_I2cInit(I2C_HandleTypeDef *i2c);
#endif
#if defined(SSD1327_SPI_CONTROL) && !defined(SSD1327_SPI_DMA_ENABLE)
void SSD1327_DmaEndCallback(SPI_HandleTypeDef *hspi);
#endif

//
// Configuration
//
void SSD1327_DisplayON(uint8_t On);
void SSD1327_InvertColors(uint8_t Invert);
void SSD1327_RotateDisplay(uint8_t Rotate);
void SSD1327_SetContrast(uint8_t Contrast);

//
// Drawing
//
void SSD1327_DrawPixel(int16_t x, int16_t y, uint8_t Color);
void SSD1327_Clear(uint8_t Color);
void SSD1327_Display(void);
void SSD1327_Bitmap(uint8_t *bitmap);

#if GRAPHIC_ACCELERATION_COMMANDS == 1
//
// Graphic Acceleration Commands
//
void SSD1327_StartScrollRight(uint8_t StartPage, uint8_t EndPage, scroll_horizontal_speed Speed);
void SSD1327_StartScrollLeft(uint8_t StartPage, uint8_t EndPage, scroll_horizontal_speed Speed);
void SSD1327_StopScroll(void);
#endif


#endif /* OLED_SSD1327_H_ */
