/**
  **********************************************************************************************************************
  * @file    oled.c
  * @author  ������
  * @version V0.1.0
  * @date    2021-3-4
  * @brief   OLED ���������к���ԭ��
  **********************************************************************************************************************
  *
  **********************************************************************************************************************
  */

/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/
#ifndef __OLED_H
#define __OLED_H

/* Includes ----------------------------------------------------------------------------------------------------------*/
#include <stdint.h>

/* OLED �����ӿڶ��� */
#define OLED_IIC_INTERFACE      0 // iic �ӿ�
#define OLED_SPI_INTERFACE      1 // spi �ӿ�
#define _DRIVE_INTERFACE_TYPE   OLED_SPI_INTERFACE

/* OLED ��ʽ����������� */
#define _USE_OLED_PRINTF


#ifdef _USE_OLED_PRINTF
/************************************************* Printf ������ڶ��� ************************************************/
#define OLED_PRINT_X            64
#define OLED_PRINT_Y            0

#define OLED_PRINT_WIDTH        (128 - OLED_PRINT_X)
#define OLED_PRINT_HIGH         (64 - OLED_PRINT_Y)

#define OLED_PRINT_FONT         FONT_12X12
/************************************************* Printf ������ڶ��� ************************************************/
#endif // _USE_OLED_PRINTF

#if _DRIVE_INTERFACE_TYPE == OLED_IIC_INTERFACE
/*************************************************** OLED IIC �˿ڶ��� ************************************************/
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_3)//SCL IIC�ӿڵ�ʱ���ź�
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_3)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_5)//SDA IIC�ӿڵ������ź�
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_5)
/*************************************************** OLED IIC �˿ڶ��� ************************************************/
#else
/*************************************************** OLED SPI �˿ڶ��� ************************************************/
#define  OLED_DC_Clr()  GPIO_ResetBits(GPIOA, GPIO_Pin_11)
#define  OLED_DC_Set()  GPIO_SetBits(GPIOA, GPIO_Pin_11)

#define  OLED_RST_Clr()  GPIO_ResetBits(GPIOA, GPIO_Pin_15)
#define  OLED_RST_Set()  GPIO_SetBits(GPIOA, GPIO_Pin_15)

#define  OLED_DIN_Clr()  GPIO_ResetBits(GPIOB, GPIO_Pin_5)
#define  OLED_DIN_Set()  GPIO_SetBits(GPIOB, GPIO_Pin_5)

#define  OLED_CLK_Clr()  GPIO_ResetBits(GPIOB, GPIO_Pin_3)
#define  OLED_CLK_Set()  GPIO_SetBits(GPIOB, GPIO_Pin_3)
/*************************************************** OLED SPI �˿ڶ��� ************************************************/
#endif

/* Exported types ----------------------------------------------------------------------------------------------------*/

typedef unsigned char oledsize_t;

/**
  * @brief ������ɫ
  */
typedef enum
{
    OLED_BLACK = 0,
    OLED_WHITE = 0xff,
}eOledcolor;

/**
  * @brief �����Сö�ٶ���
  * @note  ö��ֵ�� sg_tFontCfgTable ����ֵ��Ӧ
  */
typedef enum
{
    FONT_12X12,                             /*!< �ֳ�����: 12 x 12, Ӣ�ij����� 6 x 12 */
	FONT_16X16,                             /*!< �ֳ�����: 16 x 16, Ӣ�ij����� 8 x 16 */
	FONT_24X24,                             /*!< �ֳ�����: 24 x 24, Ӣ�ij����� 12 x 24 */
    FONT_32X32,                             /*!< �ֳ�����: 32 x 32, Ӣ�ij����� 16 x 32 */
	
	FONT_MAX_NUM
}efontSize;

/* Exported constants ------------------------------------------------------------------------------------------------*/
/* Exported macro ----------------------------------------------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------------------------------------------------*/

/* OLED ��ʼ������ ****************************************************************************************************/
extern void OLED_Init(void);

/* OLED ���ƺ��� ******************************************************************************************************/
extern void OLED_DisplayOn(void);
extern void OLED_DisplayOff(void);

/* ����/���㺯�� ******************************************************************************************************/
extern void OLED_DrawPoint(oledsize_t x, oledsize_t y, eOledcolor color);
extern void OLED_DrawRoughPoint(oledsize_t x, oledsize_t y, eOledcolor color, uint8_t size);
extern eOledcolor OLED_ReadPoint(oledsize_t x, oledsize_t y);

/* OLED �������� ******************************************************************************************************/
extern void OLED_Clear(uint8_t color);
extern void OLED_SetFill(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, eOledcolor color);

/* ����������� *******************************************************************************************************/
extern void OLED_SyncScreen(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high);
extern void OLED_ShowTask(void);
extern void OLED_SetScreenOffset(oledsize_t x, oledsize_t y, oledsize_t width, oledsize_t high, uint8_t dir, uint8_t pixels);
    
/* ��ͼ�κ��� *********************************************************************************************************/
extern void OLED_DrawLine(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, uint8_t size);
extern void OLED_DrawRectangle(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, uint8_t size);
extern void OLED_DrawCircle(oledsize_t x, oledsize_t y, oledsize_t radius, uint8_t size);

/* �����ı�/���ֺ��� **************************************************************************************************/
extern void OLED_SetColor(eOledcolor backColor, eOledcolor pointColor);
extern void OLED_SetText(oledsize_t x, oledsize_t y, const char *pszStr, uint8_t isMultiLine, efontSize size);
extern void OLED_SetIntegerNum(oledsize_t x, oledsize_t y, int32_t num, uint8_t len, uint8_t zero, efontSize size);
extern void OLED_SetFloatNum(oledsize_t x, oledsize_t y, float num, uint8_t intLen, uint8_t decLen, uint8_t zero, efontSize size);

/* ��ʽ��������� *****************************************************************************************************/
extern void OLED_XYPrintf(oledsize_t x, oledsize_t y, uint8_t isMultiLine, efontSize size, const char *format, ...);
extern void OLED_Printf(const char *format, ...);

#endif  // __OLED_H