esp-who/components/screen/screen_driver.h

281 lines
7.8 KiB
C
Raw Permalink Normal View History

2021-07-31 11:23:18 +08:00
// Copyright 2020 Espressif Systems (Shanghai) Co. Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _IOT_SCREEN_DRIVER_H_
#define _IOT_SCREEN_DRIVER_H_
#include "scr_interface_driver.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
* @brief Define all screen direction
*
*/
typedef enum
{
/* @---> X
|
Y
*/
SCR_DIR_LRTB, /**< From left to right then from top to bottom, this consider as the original direction of the screen */
/* Y
|
@---> X
*/
SCR_DIR_LRBT, /**< From left to right then from bottom to top */
/* X <---@
|
Y
*/
SCR_DIR_RLTB, /**< From right to left then from top to bottom */
/* Y
|
X <---@
*/
SCR_DIR_RLBT, /**< From right to left then from bottom to top */
/* @---> Y
|
X
*/
SCR_DIR_TBLR, /**< From top to bottom then from left to right */
/* X
|
@---> Y
*/
SCR_DIR_BTLR, /**< From bottom to top then from left to right */
/* Y <---@
|
X
*/
SCR_DIR_TBRL, /**< From top to bottom then from right to left */
/* X
|
Y <---@
*/
SCR_DIR_BTRL, /**< From bottom to top then from right to left */
SCR_DIR_MAX,
/* Another way to represent rotation with 3 bit*/
SCR_MIRROR_X = 0x40, /**< Mirror X-axis */
SCR_MIRROR_Y = 0x20, /**< Mirror Y-axis */
SCR_SWAP_XY = 0x80, /**< Swap XY axis */
} scr_dir_t;
/**
* @brief The types of colors that can be displayed on the screen
*
*/
typedef enum
{
SCR_COLOR_TYPE_MONO, /**< The screen is monochrome */
SCR_COLOR_TYPE_GRAY, /**< The screen is gray */
SCR_COLOR_TYPE_RGB565, /**< The screen is colorful */
} scr_color_type_t;
/**
* @brief All supported screen controllers
*
*/
typedef enum
{
/* color screen */
SCREEN_CONTROLLER_ILI9341,
SCREEN_CONTROLLER_ILI9806,
SCREEN_CONTROLLER_ILI9486,
SCREEN_CONTROLLER_ILI9488,
SCREEN_CONTROLLER_NT35510,
SCREEN_CONTROLLER_RM68120,
SCREEN_CONTROLLER_ST7789,
SCREEN_CONTROLLER_ST7796,
SCREEN_CONTROLLER_SSD1351,
SCREEN_CONTROLLER_SSD1963,
/* monochrome screen */
SCREEN_CONTROLLER_SSD1306,
SCREEN_CONTROLLER_SSD1307,
SCREEN_CONTROLLER_SSD1322,
} scr_controller_t;
/**
* @brief configuration of screen controller
*
*/
typedef struct
{
scr_interface_driver_t *interface_drv; /*!< Interface driver for screen */
int8_t pin_num_rst; /*!< Pin to hardreset LCD*/
int8_t pin_num_bckl; /*!< Pin for control backlight */
uint8_t rst_active_level; /*!< Reset pin active level */
uint8_t bckl_active_level; /*!< Backlight active level */
uint16_t width; /*!< Screen width */
uint16_t height; /*!< Screen height */
uint16_t offset_hor; /*!< Offset of horizontal */
uint16_t offset_ver; /*!< Offset of vertical */
scr_dir_t rotate; /*!< Screen rotate direction */
} scr_controller_config_t;
/**
* @brief Information of screen
*
*/
typedef struct
{
uint16_t width; /*!< Current screen width, it may change when apply to rotate */
uint16_t height; /*!< Current screen height, it may change when apply to rotate */
scr_dir_t dir; /*!< Current screen direction */
scr_color_type_t color_type; /*!< Color type of the screen, See scr_color_type_t struct */
uint8_t bpp; /*!< Bits per pixel */
const char *name; /*!< Name of the screen */
} scr_info_t;
/**
* @brief Define a screen common function
*
*/
typedef struct
{
/**
* @brief Initialize screen
*
* @param lcd_conf Pointer to a structure with lcd config arguments. see struct scr_controller_config_t
*
* @return
* - ESP_OK on success
* - ESP_FAIL Driver not installed
*/
esp_err_t (*init)(const scr_controller_config_t *lcd_conf);
/**
* @brief Deinitialize screen
*
* @return
* - ESP_OK on success
* - ESP_FAIL Deinitialize failed
* - ESP_ERR_NOT_SUPPORTED unsupported
*/
esp_err_t (*deinit)(void);
/**
* @brief Set screen direction of rotation
*
* @param dir Pointer to a scr_dir_t structure.
* You can set the direction in two ways, for example, set it to "SCR_DIR_LRBT" or "SCR_MIRROR_Y", They are the same, depending on which expression you want to use
*
* @note Not all screens support eight directions, it depends on the screen controller.
*
* @return
* - ESP_OK on success
* - ESP_FAIL Failed
*/
esp_err_t (*set_direction)(scr_dir_t dir);
/**
* @brief Set screen window
*
* @param x0 Starting point in X direction
* @param y0 Starting point in Y direction
* @param x1 End point in X direction
* @param y1 End point in Y direction
*
* @note When the BPP of the screen controller is less than 8, the coordinate value is limited to a multiple of some number
*
* @return
* - ESP_OK on success
* - ESP_FAIL Failed
*/
esp_err_t (*set_window)(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
/**
* @brief Write a RAM data
*
* @param color New color of a pixel
*
* @return
* - ESP_OK on success
* - ESP_FAIL Failed
*/
esp_err_t (*write_ram_data)(uint16_t color);
/**
* @brief Draw one pixel in screen with color
*
* @param x X co-ordinate of set orientation
* @param y Y co-ordinate of set orientation
* @param color New color of the pixel
*
* @return
* - ESP_OK on success
* - ESP_FAIL Failed
*/
esp_err_t (*draw_pixel)(uint16_t x, uint16_t y, uint16_t color);
/**
* @brief Fill the pixels on LCD screen with bitmap
*
* @param x Starting point in X direction
* @param y Starting point in Y direction
* @param w width of image in bitmap array
* @param h height of image in bitmap array
* @param bitmap pointer to bitmap array
*
* @return
* - ESP_OK on success
* - ESP_FAIL Failed
*/
esp_err_t (*draw_bitmap)(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t *bitmap);
/**
* @brief Get screen information
*
* @param info Pointer to a scr_info_t structure.
*
* @return
* - ESP_OK on success
* - ESP_FAIL Failed
*/
esp_err_t (*get_info)(scr_info_t *info);
} scr_driver_t;
/**
* @brief Find a screen driver
*
* @param controller Screen controller to initialize
* @param out_screen Pointer to a screen driver
*
* @return
* - ESP_OK on success
* - ESP_ERR_INVALID_ARG Arguments is NULL.
* - ESP_ERR_NOT_FOUND Screen controller was not found.
*/
esp_err_t scr_find_driver(scr_controller_t controller, scr_driver_t *out_screen);
#ifdef __cplusplus
}
#endif
#endif