Difference between revisions of "Template:E-paper for rpi and jetsonano code description"

From ingcool
Jump to: navigation, search
(创建页面,内容为“RaspberryPi与Jetson nano共用一套程序,因为他们都是嵌入式系统,兼容性比较强。<br /> 程序分为底层硬件接口、中间层墨水屏驱…”)
 
(GUI)
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
RaspberryPi与Jetson nano共用一套程序,因为他们都是嵌入式系统,兼容性比较强。<br />
+
RaspberryPi and Jetson nano uses the same libraries, as they are compatible with each other in a way.<br />
程序分为底层硬件接口、中间层墨水屏驱动、上层应用;<br />
+
The codes include bottom hardware interface, middle EPD driver and application;<br />
  
 
==C==
 
==C==
===底层硬件接口===
+
===Bottom hardware interface===
我们进行了底层的封装,由于硬件平台不一样,内部的实现是不一样的,如果需要了解内部实现可以去对应的目录中查看<br />
+
We package the bottom for different hardware platform.<br />
在DEV_Config.c(.h)可以看到很多定义,在目录:RaspberryPi&JetsonNano\c\lib\Config<br />
+
Most of the interfaces are defined in DEV_Config.c(.h) files:RaspberryPi&JetsonNano\c\lib\Config<br />
C语言使用了2种方式进行驱动:分别是BCM2835库、WiringPi库<br />
+
Two libraries are used for C codes: BCM2835 and WiringPi<br />
默认使用WiringPi库进行操作,如果你需要使用BCM2835来驱动的话,可以打开RaspberryPi&JetsonNano\c\Makefile,修改13-14行,如下:<br />
+
By default, we use WiringPI, if you want to change to BCM2835, you can modify RaspberryPi&JetsonNano\c\Makefile file and modify the line 13 and lin 14 as below::<br />
 
[[file:e-paper_Driver_HAT_RPI_Makefile.png|700px]]
 
[[file:e-paper_Driver_HAT_RPI_Makefile.png|700px]]
*数据类型:
+
*Data type:
 
  #define UBYTE  uint8_t
 
  #define UBYTE  uint8_t
 
  #define UWORD  uint16_t
 
  #define UWORD  uint16_t
 
  #define UDOUBLE uint32_t
 
  #define UDOUBLE uint32_t
*模块初始化与退出的处理:
+
*Initialize model and exit:
 
  void DEV_Module_Init(void);
 
  void DEV_Module_Init(void);
 
  void DEV_Module_Exit(void);
 
  void DEV_Module_Exit(void);
注意:
+
Notice:
  1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
+
  1. The functions are used to handle GPIO before initializing the e-Paper and after exiting.
  2.对于PCB带有Rev2.1的,DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
+
  2. If the board you have is printed with Rev2.1, the module enters low-ultra mode after DEV_Module_Exit(). (as we test, the current is about 0 in this mode);
*GPIO读写:
+
*GPIO Read/Write:
 
  void DEV_Digital_Write(UWORD Pin, UBYTE Value);
 
  void DEV_Digital_Write(UWORD Pin, UBYTE Value);
 
  UBYTE DEV_Digital_Read(UWORD Pin);
 
  UBYTE DEV_Digital_Read(UWORD Pin);
*SPI写数据
+
*SPI Write data
 
  void DEV_SPI_WriteByte(UBYTE Value);
 
  void DEV_SPI_WriteByte(UBYTE Value);
  
===中间层墨水屏驱动===
+
===Middle EPD driver===
e-paper驱动代码文件,在目录:RaspberryPi&JetsonNano\c\lib\e-Paper<br />
+
The EPD driver are saved in RaspberryPi&JetsonNano\c\lib\e-Paper<br />
打开.h可以看到如下的函数<br />
+
Open .h file you can get the functions below<br />
*墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
+
*Initialization: It should be used to initialize e-Paper or wakeup e-Paper from sleep mode.
 
  '''/2.13inch e-Paper、2.9inch e-Paper
 
  '''/2.13inch e-Paper、2.9inch e-Paper
  void EPD_xxx_Init(UBYTE Mode); // Mode = 0 全局刷新初始化、Mode = 1 局部刷新初始化
+
  void EPD_xxx_Init(UBYTE Mode); // Mode = 0 Initialize full refresh; Mode = 1 Initilize partial refresh
 
  '''//4.2inch e-Paper
 
  '''//4.2inch e-Paper
 
  void EPD_xxx_Init(void);
 
  void EPD_xxx_Init(void);
其中xxx表示,墨水屏型号。
+
xxx is the type of e-paper
  
*清屏,把墨水屏刷成白色
+
*Clear display: This function is used to clear the e-paper to white
 
  void EPD_xxx_Clear(void);  
 
  void EPD_xxx_Clear(void);  
其中xxx表示,墨水屏型号。如是是2.13,那么是EPD_2IN13_V2_Clear();如果是2.9,那就是EPD_2IN9_Clear()<br />
+
xxx is the type of e-paper, for example, if the e-paper is 2.13inch e-paper, it should be EPD_2IN13_V2_Clear(); if it is 2.9inch e-paper, it should be EPD_2IN9_Clear()<br />
  
*传输一帧的图片数据并打开显示
+
*Transmit a frame of image and display
  '''//黑白双色墨水屏
+
  '''//Blac/White e-Paper
 
  void EPD_xxx_Display(UBYTE *Image);
 
  void EPD_xxx_Display(UBYTE *Image);
  '''//黑白红或黑白黄墨水屏
+
  '''//Three colors e-Paper
 
  void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
 
  void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
  
  '''/2.13inch e-paper局部刷新,需要调用EPD_xxx_DisplayPartBaseImage显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的EPD_xxx_DisplayPart()
+
  '''// To partial refresh the 2.13inch e-paper, you should firstly use EPD_xxx_DisplayPartBaseImage function to display background, and then partial refresh by function EPD_xxx_DisplayPart()
 
  void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
 
  void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
 
  void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
 
  void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
  
*进入睡眠模式
+
*Enter sleep mode
 
  void EPD_xxx_Sleep(void);
 
  void EPD_xxx_Sleep(void);
注意进入了睡眠模式,只有两个方式能够重新工作:第一种硬件复位,第二种重新调用初始化函数<br />
+
You should hardware reset or use initialize function to wake up e-Paper from sleep mode<br />
其中xxx表示,墨水屏型号。如是是2.13,那么是EPD_2IN13_V2_Sleep()<br />
+
xxx is the type of e-Paper, if it is 2.13, you should use EPD_2IN13_V2_Sleep()<br />
  
===上层应用===
+
===Application functions===
对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能
+
Basic drawing functions are provided here. You can find then in: Raspbian Pi & Jetson Nano: RaspberryPi&JetsonNano\c\lib\GUI\GUI_Paint.c(.h)<br />
在目录:RaspberryPi&JetsonNano\c\lib\GUI\GUI_Paint.c(.h)可以找到GUI<br />
 
  
在目录:RaspberryPi&JetsonNano\c\lib\Fonts是GUI依赖的字符字体<br />
+
The fonts are saved in the directory: Raspberry Pi & Jetson Nano: RaspberryPi&JetsonNano\c\lib\Fonts<br />
  
*新建图像属性:新建一个图像属性,这个属性包括图像缓存的名称、宽度、高度、翻转角度、颜色
+
*Create a new image buffer: This function is used to create a new image with width, height, Rotate degree and its color.
 
<pre>
 
<pre>
 
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
 
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
参数:
+
Parameters:
  image : 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
+
  image: The buffer of the image, this is a pointer of buffer address;
  Width : 图像缓存的宽度;
+
  Width: width of the image;
  Height: 图像缓存的高度;
+
  Height: Height of the image;
  Rotate:图像的翻转的角度
+
  Rotate: Rotate degree;
  Color :图像的初始颜色;
+
  Color: Initial color of the image;
 
</pre>
 
</pre>
  
*选择图像缓存:选择图像缓存,选择的目的是你可以创建多个图像属性,图像缓存可以存在多个,你可以选择你所创建的每一张图像
+
*Select image buffer: this function is used to select the image buffer. You can create multiple image buffer with last function, then select the buffer for every image.
 
<pre>void Paint_SelectImage(UBYTE *image)
 
<pre>void Paint_SelectImage(UBYTE *image)
参数:
+
Parameters:
  image: 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
+
  image: The name of image buffer, it is a pointer of buffer address;
 
</pre>
 
</pre>
  
*图像旋转:设置选择好的图像的旋转角度,最好使用在Paint_SelectImage()后,可以选择旋转0、90、180、270
+
*Set display orientation: This function is used to set the rotate degree, it is generally be used after Paint_SelectImage(). You can set the rotate degree to 0、90、180、270 degree.
 
<pre>void Paint_SetRotate(UWORD Rotate)
 
<pre>void Paint_SetRotate(UWORD Rotate)
参数:
+
Parameters:
  Rotate: 图像选择角度,可以选择ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分别对应0、90、180、270度
+
  Rotate: Rotate degree, you can choose ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270 which stands for 0、90、180、270 degree repetitively.
 
</pre>
 
</pre>
  
*图像镜像翻转:设置选择好的图像的镜像翻转,可以选择不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像。
+
*Image mirroring: This function is used to mirror image.
 
<pre>void Paint_SetMirroring(UBYTE mirror)
 
<pre>void Paint_SetMirroring(UBYTE mirror)
参数:
+
Parameters:
  mirror: 图像的镜像方式,可以选择MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分别对应不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像
+
  mirror: You can set it to MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN
 
</pre>
 
</pre>
*设置点在缓存中显示位置和颜色:这里是GUI最核心的一个函数、处理点在缓存中显示位置和颜色;
+
et pixel: this function is used to set the position and color of pixels in the buffer. This is the basic function of GUI.
 
<pre>
 
<pre>
 
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
 
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
参数:
+
Parameters:
  Xpoint: 点在图像缓存中X位置
+
  Xpoint: X-axes in buffer;
  Ypoint: 点在图像缓存中Y位置
+
  Ypoint: Y-axes in buffer;
  Color : 点显示的颜色
+
  Color : color
 
</pre>
 
</pre>
  
*图像缓存填充颜色:把图像缓存填充为某颜色,一般作为屏幕刷白的作用
+
*Clear: This function is used to clear the screen to certain color.
 
<pre>
 
<pre>
 
void Paint_Clear(UWORD Color)
 
void Paint_Clear(UWORD Color)
参数:
+
Parameters:
  Color: 填充的颜色
+
  Color:  
 
</pre>
 
</pre>
  
*图像缓存部分窗口填充颜色:把图像缓存的某部分窗口填充为某颜色,一般作为窗口刷白的作用,常用于时间的显示,刷白上一秒
+
*Clear windows:this function is used to clear a window. It is generally used for time display.
 
<pre>
 
<pre>
 
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
 
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
参数:
+
Parameters:
  Xstart: 窗口的X起点坐标
+
  Xstart: Start coordinate of X-axes of the window;
  Ystart: 窗口的Y起点坐标
+
  Ystart: Start coordinate of Y-axes of the window;
  Xend: 窗口的X终点坐标
+
  Xend: End coordinate of X-axes of the window;
  Yend: 窗口的Y终点坐标
+
  Yend: End coordinate of Y-axes of the window;
  Color: 填充的颜色
+
  Color:  
 
</pre>
 
</pre>
  
*画点:在图像缓存中,在(Xpoint, Ypoint)上画点,可以选择颜色,点的大小,点的风格
+
*Draw point: Draw a point on the position (Xpoint, Ypoint)in buffer
 
<pre>
 
<pre>
 
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
 
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
参数:
+
Parameters:
  Xpoint: 点的X坐标
+
  Xpoint: X coordinate of point;
  Ypoint: 点的Y坐标
+
  Ypoint: Y coordinate of point;
  Color: 填充的颜色
+
  Color: color of point;
  Dot_Pixel: 点的大小,提供默认的8种大小点
+
  Dot_Pixel: the size of point, there are 8 sizes available;
 
  typedef enum {
 
  typedef enum {
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
Line 133: Line 132:
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  } DOT_PIXEL;
 
  } DOT_PIXEL;
  Dot_Style: 点的风格,大小扩充方式是以点为中心扩大还是以点为左下角往右上扩大
+
  Dot_Style: style of point.
 
  typedef enum {
 
  typedef enum {
 
    DOT_FILL_AROUND  = 1,
 
    DOT_FILL_AROUND  = 1,
Line 140: Line 139:
 
</pre>
 
</pre>
 
   
 
   
*画线:在图像缓存中,从 (Xstart, Ystart) (Xend, Yend) 画线,可以选择颜色,线的宽度,线的风格
+
*Draw line: draw a line for (Xstart, Ystart) to (Xend, Yend)
 
<pre>
 
<pre>
 
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
 
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
参数:
+
Parameters:
  Xstart: 线的X起点坐标
+
  Xstart: Start coordinate of X-axes of line;
  Ystart: 线的Y起点坐标
+
  Ystart: Start coordinate of Y-axes of line;
  Xend: 线的X终点坐标
+
  Xend: End coordinate of X-axes of line;
  Yend: 线的Y终点坐标
+
  Yend: End coordinate of Y-axes of line;
  Color: 填充的颜色
+
  Color: color of line
  Line_width: 线的宽度,提供默认的8种宽度
+
  Line_width: the width of line, 8 sizes are avalilable;
 
  typedef enum {
 
  typedef enum {
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
Line 160: Line 159:
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  } DOT_PIXEL;
 
  } DOT_PIXEL;
  Line_Style: 线的风格,选择线是以直线连接还是以虚线的方式连接
+
  Line_Style:Style of the line;
 
  typedef enum {
 
  typedef enum {
 
  LINE_STYLE_SOLID = 0,
 
  LINE_STYLE_SOLID = 0,
Line 167: Line 166:
 
</pre>
 
</pre>
  
*画矩形:在图像缓存中,从 (Xstart, Ystart) (Xend, Yend) 画一个矩形,可以选择颜色,线的宽度,是否填充矩形内部
+
*Draw rectangle: Draw a rectangle from (Xstart, Ystart) to (Xend, Yend).
 
<pre>
 
<pre>
 
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
 
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
+
Parameters:
  Xstart: 矩形的X起点坐标
+
  Xstart: Start coordinate of X-axes of rectangle
  Ystart: 矩形的Y起点坐标
+
  Ystart: Start coordinate of Y-axes of rectangle
  Xend: 矩形的X终点坐标
+
  Xend: End coordinate of X-end of rectangle
  Yend: 矩形的Y终点坐标
+
  Yend: End coordinate of Y-end of rectangle
  Color: 填充的颜色
+
  Color: color of rectangle
  Line_width: 矩形四边的宽度,提供默认的8种宽度
+
  Line_width: The width of edges, 8 sides are available;
 
  typedef enum {
 
  typedef enum {
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
Line 187: Line 186:
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  } DOT_PIXEL;
 
  } DOT_PIXEL;
  Draw_Fill: 填充,是否填充矩形的内部
+
  Draw_Fill: set the rectangle full or empty.
 
  typedef enum {
 
  typedef enum {
 
  DRAW_FILL_EMPTY = 0,
 
  DRAW_FILL_EMPTY = 0,
Line 194: Line 193:
 
</pre>
 
</pre>
  
*画圆:在图像缓存中,以 (X_Center Y_Center) 为圆心,画一个半径为Radius的圆,可以选择颜色,线的宽度,是否填充圆内部
+
*Draw circle:Draw a circle, use (X_Center Y_Center) as center;
 
<pre>
 
<pre>
 
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
 
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
+
Parameters:
  X_Center: 圆心的X坐标
+
  X_Center: X coordinate of center
  Y_Center: 圆心的Y坐标
+
  Y_Center: Y coordinate of center
  Radius:圆的半径
+
  Radius:Radius of circle
  Color: 填充的颜色
+
  Color: color of circle
  Line_width: 圆弧的宽度,提供默认的8种宽度
+
  Line_width: width of circle, 8 sizes are avalilable
 
  typedef enum {
 
  typedef enum {
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
 
  DOT_PIXEL_1X1  = 1, // 1 x 1
Line 213: Line 212:
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  DOT_PIXEL_8X8  , // 8 X 8
 
  } DOT_PIXEL;
 
  } DOT_PIXEL;
  Draw_Fill: 填充,是否填充圆的内部
+
  Draw_Fill: style of circle
 
  typedef enum {
 
  typedef enum {
 
  DRAW_FILL_EMPTY = 0,
 
  DRAW_FILL_EMPTY = 0,
Line 220: Line 219:
 
</pre>
 
</pre>
  
*写Ascii字符:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一个Ascii字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
+
*Draw character (ASCII): Set(Xstart Ystart) as letf-top point, draw a ASCII character.
 
<pre>
 
<pre>
 
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
 
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
+
Parameters:
  Xstart: 字符的左顶点X坐标
+
  Xstart: X coordinate of left-top pixel of character;
  Ystart: 字体的左顶点Y坐标
+
  Ystart: Y coordinate of left-top pixel of character;
  Ascii_Char:Ascii字符
+
  Ascii_Char:Ascii character;
  Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
+
  Font: 5 fonts are available;
  font8:5*8的字体
+
  font8:5*8
  font12:7*12的字体
+
  font12:7*12
  font16:11*16的字体
+
  font16:11*16
  font20:14*20的字体
+
  font20:14*20
  font24:17*24的字体
+
  font24:17*24
  Color_Foreground: 字体颜色
+
  Color_Foreground: color of character;
  Color_Background: 背景颜色
+
  Color_Background: color of background;
 
</pre>
 
</pre>
  
*写英文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串英文字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
+
*Draw String: Set point (Xstart Ystart) as the left-top pixel, draw a string.
 
<pre>
 
<pre>
 
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
 
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
+
Parameters:
  Xstart: 字符的左顶点X坐标
+
  Xstart: X coordinate of left-top pixel of characters;
  Ystart: 字体的左顶点Y坐标
+
  Ystart: Y coordinate of left-top pixel of characters;
  pString:字符串,字符串是一个指针
+
  pString:Pointer of string
  Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
+
  Font: 5 fonts are available:
  font8:5*8的字体
+
  font8:5*8
  font12:7*12的字体
+
  font12:7*12
  font16:11*16的字体
+
  font16:11*16
  font20:14*20的字体
+
  font20:14*20
  font24:17*24的字体
+
  font24:17*24
  Color_Foreground: 字体颜色
+
  Color_Foreground: color of string
  Color_Background: 背景颜色
+
  Color_Background: color of background
 
</pre>
 
</pre>
  
*写中文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串中文字符,可以选择GB2312编码字符字库、字体前景色、字体背景色;
+
*Draw Chinese charactgers: this function is used to draw Chinese fonts based ON GB2312 fonts.
 
<pre>
 
<pre>
 
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
 
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
参数:
+
Parameters:
  Xstart: 字符的左顶点X坐标
+
  Xstart: Coordinate of left-top pixel of characters;
  Ystart: 字体的左顶点Y坐标
+
  Ystart: Coordinate of left-top pixel of characters;
  pString:字符串,字符串是一个指针
+
  pString:Pointer of string;
  Font: GB2312编码字符字库,在Fonts文件夹中提供了以下字体:
+
  Font: GB2312 fonts:
  font12CN:ascii字符字体11*21,中文字体16*21
+
  font12CN:11*21(ascii),16*21 (Chinese)
  font24CN:ascii字符字体24*41,中文字体32*41
+
  font24CN:24*41(ascii),32*41 (Chinese)
  Color_Foreground: 字体颜色
+
  Color_Foreground: color of string
  Color_Background: 背景颜色
+
  Color_Background: color of background
 
</pre>
 
</pre>
  
*写数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色
+
*Draw number: Draw a string of numbers, (Xstart, Ystart) is the left-top pixel.
 
<pre>
 
<pre>
 
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
 
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
+
Parameters:
  Xstart: 字符的左顶点X坐标
+
  Xstart: X coordinate of left-top pixel;
  Ystart: 字体的左顶点Y坐标
+
  Ystart: Y coordicate of left-to pixel;
  Nummber:显示的数字,这里使用的是32位长的int型保存,可以最大显示到2147483647
+
  Nummber: the numbers displayed. the numbers are saved in int format, the maximum is 2147483647;
  Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
+
  Font: 5 fonts are available:
  font8:5*8的字体
+
  font8:5*8
  font12:7*12的字体
+
  font12:7*12
  font16:11*16的字体
+
  font16:11*16
  font20:14*20的字体
+
  font20:14*20
  font24:17*24的字体
+
  font24:17*24
  Color_Foreground: 字体颜色
+
  Color_Foreground: color of font;
  Color_Background: 背景颜色
+
  Color_Background: color of background;
 
</pre>
 
</pre>
  
*显示时间:在图像缓存中,在 (Xstart Ystart) 为左顶点,显示一段时间,可以选择Ascii码可视字符字库、字体前景色、字体背景色;这里是方便测试局部刷新而写的,因为局部刷新需要的时间为0.3S,整体显示少于1S加上数据的传输,可以做到1S刷新一次
+
*Display time:Display time, (Xstart, Ystart) is the left-top pixel. This function is used for e-Paper which supports partial refresh
 
<pre>
 
<pre>
 
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
 
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
参数:
+
Parameters:
  Xstart: 字符的左顶点X坐标
+
  Xstart: X coordinate of left-top pixel of character;
  Ystart: 字体的左顶点Y坐标
+
  Ystart: Y coordinate of left-top pixel of character;
  pTime:显示的时间,这里定义好了一个时间的结构体,只要把时分秒各位数传给参数;
+
  pTime:pointer of time displayed;
  Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
+
  Font: 5 fonts are available;
  font8:5*8的字体
+
  font8:5*8
  font12:7*12的字体
+
  font12:7*12
  font16:11*16的字体
+
  font16:11*16
  font20:14*20的字体
+
  font20:14*20
  font24:17*24的字体
+
  font24:17*24
  Color_Foreground: 字体颜色
+
  Color_Foreground: color of fonts
  Color_Background: 背景颜色
+
  Color_Background: color of background
 
</pre>
 
</pre>
  
*写图片:把一个位图写入图像缓存中
+
*Draw image:send image data of bmp file to buffer
 
<pre>
 
<pre>
 
void Paint_DrawBitMap(const unsigned char* image_buffer)
 
void Paint_DrawBitMap(const unsigned char* image_buffer)
参数:
+
Parameters:
  image_buffer: 图像数据的缓存中的首地址
+
  image_buffer: adrress of image data in buffer
 
</pre>
 
</pre>
  
*读取本地的bmp图片并写到缓存中
+
*Read local bmp picture and write it to buffer
对于Jetson Nano, Raspberry Pi这些Linux操作系统的,可以读写图片<br />
+
Linux platform like Jetson Nano and Raspberry Pi support to directly operate bmp pictures<br />
对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi&JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)<br />
+
Raspberry Pi & Jetson Nano:RaspberryPi&JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)<br />
 
<pre>
 
<pre>
 
UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
 
UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
参数:
+
Parameters:
path:BMP图片的相对路径
+
path:The path of BMP pictures
  Xstart: 图片的左顶点X坐标,一般默认传0
+
  Xstart: X coordination of left-top of picture, default 0;
  Ystart: 图片的左顶点Y坐标,一般默认传0
+
  Ystart: Y coordination of left-top of picture, default 0;
 
</pre>
 
</pre>
  
===用户测试代码===
+
===Testing code===
前三个章节介绍了经典的linux三层代码结构,这里稍微讲解一下用户测试代码<br />
+
In the above part, we describe the tree structures of Linux codes, here we talk about the testing code for user.<br />
对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi&JetsonNano\c\examples,为全部的测试代码,在本目录下的main.c中可以多个屏蔽;<br />
+
Raspberry Pi & Jetson Nano: RaspberryPi&JetsonNano\c\examples. The codes in examples are testing code, you can modify the definition in main.c file for different types of e-Paper.<br />
  
如果需要运行2.13inch e-paper测试程序,你需要把对应的屏蔽去掉<br />
+
For example, if you want to test 2.13inch e-paper, you need to delete the "//" symbol on line 32.<br />
 
  // EPD_2in13_V2_test();
 
  // EPD_2in13_V2_test();
改成<br />
+
Change it to<br />
 
  EPD_2in13_V2_test();
 
  EPD_2in13_V2_test();
在linux命令模式下重新执行如下:<br />
+
Then compile it again and run <br />
 
<pre>
 
<pre>
 
make clean
 
make clean
Line 335: Line 334:
 
</pre>
 
</pre>
  
==Python(适用于Jetson Nano\Raspberry Pi)==
+
==Python(Can be used for Jetson Nano\Raspberry Pi)==
适用于python2.7和python3<br />
+
It is compatible with python2.7 and python3<br />
对于python而言他的调用没有C复杂<br />
+
python is easy to use than c codes<br />
Raspberry Pi和Jetson Nano:RaspberryPi&JetsonNano\python\lib\<br />
+
Raspberry Pi and Jetson Nano:RaspberryPi&JetsonNano\python\lib\<br />
  
 
===epdconfig.py===
 
===epdconfig.py===
*模块初始化与退出的处理:
+
*Initialize module and exit handle:
 
<pre>
 
<pre>
 
def module_init()
 
def module_init()
 
def module_exit()
 
def module_exit()
注意:
 
1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
 
2.对于PCB带有Rev2.1的,module_exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
 
 
</pre>
 
</pre>
 
+
Note:
*GPIO读写:
+
1.The functions are used to set GPIP before and after driving e-Paper.
 +
2.If the board you have is printed with Rev2.1, module enter low-ultra mode after Module_Exit(). (as we test, the current is about 0 in this mode);
 +
*GPIO Read/Write:
 
<pre>
 
<pre>
 
def  digital_write(pin, value)
 
def  digital_write(pin, value)
Line 356: Line 354:
 
</pre>
 
</pre>
  
*SPI写数据
+
*SPI Write data:
 
<pre>
 
<pre>
 
def spi_writebyte(data)
 
def spi_writebyte(data)
 
</pre>
 
</pre>
  
===epdxxx.py(xxx表示尺寸,若是2.13inch e-paper,则为epd2in13.py,依此类推)===
+
===epdxxx.py(xxx is the type of e-Paper)===
*墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
+
*Initailize e-paper: this function should be used at the begining. It can also be used to wake up e-Paper from Sleep mode.
 
<pre>
 
<pre>
对于2.13inch e-Paper、2.9inch e-Paper
+
#For 2.13inch e-Paper、2.9inch e-Paper
def init(self, update) # 选择lut_full_update或lut_partial_update
+
def init(self, update) # Choose lut_full_update or lut_partial_update
其他型号
+
#Other type
 
def init(self)
 
def init(self)
 
</pre>
 
</pre>
  
*清屏,把墨水屏刷成白色
+
*Clear e-paper: This function is used to clear e-Paper to white;
 
<pre>
 
<pre>
 
def Clear(self)
 
def Clear(self)
def Clear(self, color) # 对于某几个屏幕需要调用这个
+
def Clear(self, color) # Some types of e-Paper should use this function to clear screen
 
</pre>
 
</pre>
  
*把图片转换成数组
+
*Convert image to arrays
 
<pre>
 
<pre>
 
def getbuffer(self, image)
 
def getbuffer(self, image)
 
</pre>
 
</pre>
  
*传输一帧的图片数据并打开显示
+
*Transmit one frame of image data and display
 
<pre>
 
<pre>
黑白双色墨水屏
+
#For two-color e-paper
 
def display(self, image)
 
def display(self, image)
  
 
+
#Because that controllers of 2.13inch e-paper are updated, when partial refresh, they should first use displayPartBaseImage() to display static background, then use displayPart() to dynamaticlly display.
对于2.13inch e-paper由于控制芯片升级,对于局部刷新,需要调用displayPartBaseImage()显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的displayPart()
 
 
def displayPartBaseImage(self, image)
 
def displayPartBaseImage(self, image)
 
def displayPart(self, image)
 
def displayPart(self, image)
 
</pre>
 
</pre>
  
*进入睡眠模式
+
*Enter sleep mode
 
<pre>
 
<pre>
 
def sleep(self)
 
def sleep(self)
 
</pre>
 
</pre>
  
===epd_xxx_test.py(xxx表示尺寸,若是2.13inch e-paper,则为epd_2in13_V2_test.py,依此类推)===
+
===epd_xxx_test.py(xxx is type of e-paper)===
python在如下目录:<br />
+
python examples are saved in directory:<br />
 
Raspberry Pi和Jetson Nano:RaspberryPi&JetsonNano\python\examples\<br />
 
Raspberry Pi和Jetson Nano:RaspberryPi&JetsonNano\python\examples\<br />
  
如果你的python版本是python2,且需要运行2.13inch e-paper测试程序,在linux命令模式下重新执行如下:<br />
+
If the python installed in your OS is python2, you should run examples like below:<br />
 
<pre>
 
<pre>
 
sudo python epd_2in13_V2_test.py
 
sudo python epd_2in13_V2_test.py
 
</pre>
 
</pre>
如果你的python版本是python3,且需要运行2.13inch e-paper测试程序,在linux命令模式下重新执行如下:<br />
+
If it is python3, the commands should be:<br />
 
<pre>
 
<pre>
 
sudo python3 epd_2in13-V2_test.py
 
sudo python3 epd_2in13-V2_test.py
 
</pre>
 
</pre>
===关于旋转设置===
+
 
如果在python程序中你需要设置屏幕旋转,可以通过语句blackimage = blackimage.transpose(Image.ROTATE_270)设置。
+
===Orientation===
 +
To rotate the display, you can use transpose function like blackimage = blackimage.transpose(Image.ROTATE_270):
 
<pre>
 
<pre>
 
blackimage = blackimage.transpose(Image.ROTATE_270)  
 
blackimage = blackimage.transpose(Image.ROTATE_270)  
 
redimage = redimage.transpose(Image.ROTATE_270)
 
redimage = redimage.transpose(Image.ROTATE_270)
#支持ROTATE_90, ROTATE_180, ROTATE_270三个参数
+
#Support ROTATE_90, ROTATE_180, ROTATE_270
 
</pre>
 
</pre>
  
  
===画图GUI===
+
===GUI===
由于python有一个image库[http://effbot.org/imagingbook pil官方库链接],他十分的强大,不需要像C从逻辑层出发编写代码,可以直接引用image库进行图像处理,以下将以1.54inch e-paper为例,对程序中使用了的进行简要说明<br />
+
Python has a powerful PIL library [http://effbot.org/imagingbook PIL link], which can be used directly to drawing figures. Here we use it for drawing<br />
*需要使用image库,需要安装库
+
*Install the library firstly
 
<pre>
 
<pre>
sudo apt-get install python3-pil 安装库
+
sudo apt-get install python3-pil  
 
</pre>
 
</pre>
  
然后导入库<br />
+
Import the library<br />
 
<pre>
 
<pre>
 
from PIL import Image,ImageDraw,ImageFont
 
from PIL import Image,ImageDraw,ImageFont
 
</pre>
 
</pre>
其中Image为基本库、ImageDraw为画图功能、ImageFont为文字<br />
+
Image: library; ImageDraw: drawing function; ImageFont: fonts<br />
  
*定义一个图像缓存,以方便在图片上进行画图、写字等功能
+
*Set image buffer for drawing.
 
<pre>
 
<pre>
 
image = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame
 
image = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame
 
</pre>
 
</pre>
第一个参数定义图片的颜色深度,定义为1说明是2位图,第二个参数是一个元组,定义好图片的宽度和高度,第三个参数是定义缓存的默认颜色,0为黑色,255为白色。<br />
+
The first parameter is the depth of color, 1 means 2 grayscale. The second parameter is a tuple of image size. The third parameter is color of the image, 0 is black and 255 is white.<br />
  
*创建一个基于image的画图对象,所有的画图操作都在这个对象上
+
*Create an image object.
 
<pre>
 
<pre>
 
draw = ImageDraw.Draw(image)
 
draw = ImageDraw.Draw(image)
 
</pre>
 
</pre>
  
*画框
+
*Draw rectangle
 
<pre>
 
<pre>
 
draw.rectangle((0, 10, 200, 34), fill = 0)
 
draw.rectangle((0, 10, 200, 34), fill = 0)
 
</pre>
 
</pre>
第一个参数为一个4个元素的元组,(0,10)矩形左上角坐标值,(200,34)为矩形右下角坐标值,fill=0表示内部填充黑色。<br />
+
The first parameter is a tuple of coordination. 0, 10 is the top-left point of rectangle, 200, 34) is the right-bottom point. fille = 0 set the filled color to black.<br />
  
*画线
+
*Draw line
 
<pre>
 
<pre>
 
draw.line((16, 60, 56, 60), fill = 0)
 
draw.line((16, 60, 56, 60), fill = 0)
 
</pre>
 
</pre>
第一个参数为一个4个元素的元组,以(16,60)为起始点,(200,34)为终止点,画一条直线,fill=0表示线为黑色。<br />
+
The first parameter is a type of coordination, 16, 60 is the begin point, 200, 34 is the end point. fill=0 set the line to black<br />
  
*画圆
+
*Draw circle
 
<pre>
 
<pre>
 
draw.arc((90, 60, 150, 120), 0, 360, fill = 0)
 
draw.arc((90, 60, 150, 120), 0, 360, fill = 0)
 
</pre>
 
</pre>
在正方形内画一个内切圆,第一个参数为一个4个元素的元组,以(90,60)为正方形的左上角顶点,(150,120)为正方形右下角顶点,规定矩形框的水平中位线为0度角,角度顺时针变大,第二个参数表示开始角度,第三个参数标识结束角度,fill=0线为黑色<br />
+
This function is used to draw a encircle of a square. The first parameter is a tuple of coordination of the square.  the degree of the circle is 0 to 360 °, fille=0 set the circle to black.<br />
如果不是正方形,画出来的就是椭圆,这个实际上是圆弧的绘制。<br />
+
If the figure is not square according to the coordination, you will get an ellipse.。<br />
  
除了arc可以话圆之外,还有chord可以画实心圆<br />
+
Besides the arc function, you can also use chord function for drawing solid circle.<br />
 
<pre>
 
<pre>
 
draw.chord((90, 130, 150, 190), 0, 360, fill = 0)
 
draw.chord((90, 130, 150, 190), 0, 360, fill = 0)
 
</pre>
 
</pre>
实质是弦的绘制,第一个参数指定弦的圆外切矩形,第二、三两个参数分别是弦的起始和终止角度, 第四个参数是填充颜色,将弦从0度到360度连接并填充就变成了填充的圆了。<br />
+
The first parameter is the coordination of the enclosing rectangle. The second and third parameters are the beginning and end degrees of the circle. The fourth parameter is the fill color of the circle.<br />
  
*写字符
+
*Character
写字符往往需要写不同大小的字符,需要导入ImageFont模块,并实例化:<br />
+
You can directkt import ImageFont model for drawing characters:<br />
 
<pre>
 
<pre>
 
font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
 
font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
 
</pre>
 
</pre>
为了丰富字体库,这里使用的是windows目录下的字符文件,如果是其他的ttc结尾的字符文件也是支持的。<br />
+
You can use the fonts of Windows or other fonts which is in ttc format.<br />
  
写英文字符直接使用即可,写中文,由于编码是GB2312所以需要在前面加个u:<br />
+
To draw English character, you can directly use the fonts; for Chinese character, you need to add a symbol u:<br />
 
<pre>
 
<pre>
 
draw.text((8, 12), 'hello world', font = font, fill = 255)
 
draw.text((8, 12), 'hello world', font = font, fill = 255)
 
draw.text((8, 36), u'电子墨水屏', font = font, fill = 0)
 
draw.text((8, 36), u'电子墨水屏', font = font, fill = 0)
 
</pre>
 
</pre>
第一个参数为一个2个元素的元组,以(8,12)为左顶点,字体为font,点,fill为字体颜色,第一句fill=255所以看上去是不会显示的,第二句显示微雪电子。<br />
+
The first parameter is a tuple of coordination of character, the second parameter is the font and las one is set the color.<br />
  
*读取本地图片
+
*Read local picture
 
<pre>
 
<pre>
 
image = Image.open(os.path.join(picdir, '2in13-v2.bmp'))
 
image = Image.open(os.path.join(picdir, '2in13-v2.bmp'))
 
</pre>
 
</pre>
参数为图片路径。
+
The parameter is the path of picture.
  
*其他功能
+
*Other functions.
python的image库十分强大,如果需要实现其他的更多功能,可以上官网学习http://effbot.org/imagingbook pil,官方的是英文的,如果感觉对你不友好,当然我们国内也有很多的优秀的博客都有讲解。
+
For more information about the PIL library, please refer to http://effbot.org/imagingbook.

Latest revision as of 16:42, 29 July 2020

RaspberryPi and Jetson nano uses the same libraries, as they are compatible with each other in a way.
The codes include bottom hardware interface, middle EPD driver and application;

C

Bottom hardware interface

We package the bottom for different hardware platform.
Most of the interfaces are defined in DEV_Config.c(.h) files:RaspberryPi&JetsonNano\c\lib\Config
Two libraries are used for C codes: BCM2835 and WiringPi
By default, we use WiringPI, if you want to change to BCM2835, you can modify RaspberryPi&JetsonNano\c\Makefile file and modify the line 13 and lin 14 as below::
E-paper Driver HAT RPI Makefile.png

  • Data type:
#define UBYTE   uint8_t
#define UWORD   uint16_t
#define UDOUBLE uint32_t
  • Initialize model and exit:
void DEV_Module_Init(void);
void DEV_Module_Exit(void);

Notice:

1. The functions are used to handle GPIO before initializing the e-Paper and after exiting.
2. If the board you have is printed with Rev2.1, the module enters low-ultra mode after DEV_Module_Exit(). (as we test, the current is about 0 in this mode);
  • GPIO Read/Write:
void DEV_Digital_Write(UWORD Pin, UBYTE Value);
UBYTE DEV_Digital_Read(UWORD Pin);
  • SPI Write data
void DEV_SPI_WriteByte(UBYTE Value);

Middle EPD driver

The EPD driver are saved in RaspberryPi&JetsonNano\c\lib\e-Paper
Open .h file you can get the functions below

  • Initialization: It should be used to initialize e-Paper or wakeup e-Paper from sleep mode.
/2.13inch e-Paper、2.9inch e-Paper
void EPD_xxx_Init(UBYTE Mode); // Mode = 0 Initialize full refresh; Mode = 1 Initilize partial refresh 
//4.2inch e-Paper
void EPD_xxx_Init(void);

xxx is the type of e-paper

  • Clear display: This function is used to clear the e-paper to white
void EPD_xxx_Clear(void); 

xxx is the type of e-paper, for example, if the e-paper is 2.13inch e-paper, it should be EPD_2IN13_V2_Clear(); if it is 2.9inch e-paper, it should be EPD_2IN9_Clear()

  • Transmit a frame of image and display
//Blac/White e-Paper
void EPD_xxx_Display(UBYTE *Image);
//Three colors e-Paper
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
// To partial refresh the 2.13inch e-paper, you should firstly use EPD_xxx_DisplayPartBaseImage function to display background, and then partial refresh by function EPD_xxx_DisplayPart()
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
  • Enter sleep mode
void EPD_xxx_Sleep(void);

You should hardware reset or use initialize function to wake up e-Paper from sleep mode
xxx is the type of e-Paper, if it is 2.13, you should use EPD_2IN13_V2_Sleep()

Application functions

Basic drawing functions are provided here. You can find then in: Raspbian Pi & Jetson Nano: RaspberryPi&JetsonNano\c\lib\GUI\GUI_Paint.c(.h)

The fonts are saved in the directory: Raspberry Pi & Jetson Nano: RaspberryPi&JetsonNano\c\lib\Fonts

  • Create a new image buffer: This function is used to create a new image with width, height, Rotate degree and its color.
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
Parameters:
 	image: The buffer of the image, this is a pointer of buffer address;
 	Width: width of the image;
 	Height: Height of the image;
 	Rotate: Rotate degree;
 	Color: Initial color of the image;
  • Select image buffer: this function is used to select the image buffer. You can create multiple image buffer with last function, then select the buffer for every image.
void Paint_SelectImage(UBYTE *image)
Parameters:
 	image: The name of image buffer, it is a pointer of buffer address;
  • Set display orientation: This function is used to set the rotate degree, it is generally be used after Paint_SelectImage(). You can set the rotate degree to 0、90、180、270 degree.
void Paint_SetRotate(UWORD Rotate)
Parameters:
 	Rotate: Rotate degree, you can choose ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270 which stands for 0、90、180、270 degree repetitively.
  • Image mirroring: This function is used to mirror image.
void Paint_SetMirroring(UBYTE mirror)
Parameters:
 	mirror: You can set it to MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN

et pixel: this function is used to set the position and color of pixels in the buffer. This is the basic function of GUI.

void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
Parameters:
 	Xpoint: X-axes in buffer;
 	Ypoint: Y-axes in buffer;
 	Color : color
  • Clear: This function is used to clear the screen to certain color.
void Paint_Clear(UWORD Color)
Parameters:
 	Color: 
  • Clear windows:this function is used to clear a window. It is generally used for time display.
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
Parameters:
 	Xstart: Start coordinate of X-axes of the window;
 	Ystart: Start coordinate of Y-axes of the window;
 	Xend: End coordinate of X-axes of the window;
 	Yend: End coordinate of Y-axes of the window;
 	Color: 
  • Draw point: Draw a point on the position (Xpoint, Ypoint)in buffer
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
Parameters:
 	Xpoint: X coordinate of point;
 	Ypoint: Y coordinate of point;
 	Color: color of point;
 	Dot_Pixel: the size of point, there are 8 sizes available;
 	 	 typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  , 	 	// 3 X 3
 	 	 	 DOT_PIXEL_4X4  , 	 	// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Dot_Style: style of point. 
 	 	typedef enum {
 	 	   DOT_FILL_AROUND  = 1,		
 	 	   DOT_FILL_RIGHTUP,
 	 	} DOT_STYLE;
  • Draw line: draw a line for (Xstart, Ystart) to (Xend, Yend)
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
Parameters:
 	Xstart: Start coordinate of X-axes of line;
 	Ystart: Start coordinate of Y-axes of line;
 	Xend: End coordinate of X-axes of line;
 	Yend: End coordinate of Y-axes of line;
 	Color: color of line
 	Line_width: the width of line, 8 sizes are avalilable;
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	 Line_Style:Style of the line;
 	 	typedef enum {
 	 	 	 LINE_STYLE_SOLID = 0,
 	 	 	 LINE_STYLE_DOTTED,
 	 	} LINE_STYLE;
  • Draw rectangle: Draw a rectangle from (Xstart, Ystart) to (Xend, Yend).
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
Parameters:
 	Xstart: Start coordinate of X-axes of rectangle
 	Ystart: Start coordinate of Y-axes of rectangle
 	Xend: End coordinate of X-end of rectangle
 	Yend: End coordinate of Y-end of rectangle
 	Color: color of rectangle
 	Line_width: The width of edges, 8 sides are available;
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: set the rectangle full or empty.
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • Draw circle:Draw a circle, use (X_Center Y_Center) as center;
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
Parameters:
 	X_Center: X coordinate of center
 	Y_Center: Y coordinate of center
 	Radius:Radius of circle
 	Color: color of circle
 	Line_width: width of circle, 8 sizes are avalilable
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: style of circle
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • Draw character (ASCII): Set(Xstart Ystart) as letf-top point, draw a ASCII character.
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
Parameters:
 	Xstart: X coordinate of left-top pixel of character;
 	Ystart: Y coordinate of left-top pixel of character;
 	Ascii_Char:Ascii character;
 	Font: 5 fonts are available;
 	 	font8:5*8
 	 	font12:7*12
 	 	font16:11*16
 	 	font20:14*20
 	 	font24:17*24
 	Color_Foreground: color of character;
 	Color_Background: color of background;
  • Draw String: Set point (Xstart Ystart) as the left-top pixel, draw a string.
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
Parameters:
 	Xstart: X coordinate of left-top pixel of characters;
 	Ystart: Y coordinate of left-top pixel of characters;
 	pString:Pointer of string
 	Font: 5 fonts are available:
 	 	font8:5*8
 	 	font12:7*12
 	 	font16:11*16
 	 	font20:14*20
 	 	font24:17*24
 	Color_Foreground: color of string
 	Color_Background: color of background
  • Draw Chinese charactgers: this function is used to draw Chinese fonts based ON GB2312 fonts.
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
Parameters:
 	Xstart: Coordinate of left-top pixel of characters;
 	Ystart: Coordinate of left-top pixel of characters;
 	pString:Pointer of string;
 	Font: GB2312 fonts:
 	 	font12CN:11*21(ascii),16*21 (Chinese)
 	 	font24CN:24*41(ascii),32*41 (Chinese)
 	Color_Foreground: color of string
 	Color_Background: color of background
  • Draw number: Draw a string of numbers, (Xstart, Ystart) is the left-top pixel.
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
Parameters:
 	Xstart: X coordinate of left-top pixel;
 	Ystart: Y coordicate of left-to pixel;
 	Nummber: the numbers displayed. the numbers are saved in int format, the maximum is 2147483647;
 	Font: 5 fonts are available:
 	 	font8:5*8
 	 	font12:7*12
 	 	font16:11*16
 	 	font20:14*20
 	 	font24:17*24
 	Color_Foreground: color of font;
 	Color_Background: color of background;
  • Display time:Display time, (Xstart, Ystart) is the left-top pixel. This function is used for e-Paper which supports partial refresh
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
Parameters:
 	Xstart: X coordinate of left-top pixel of character;
 	Ystart: Y coordinate of left-top pixel of character;
 	pTime:pointer of time displayed;
 	Font: 5 fonts are available;
 	 	font8:5*8
 	 	font12:7*12
 	 	font16:11*16
 	 	font20:14*20
 	 	font24:17*24
 	Color_Foreground: color of fonts
 	Color_Background: color of background
  • Draw image:send image data of bmp file to buffer
void Paint_DrawBitMap(const unsigned char* image_buffer)
Parameters:
 	image_buffer: adrress of image data in buffer
  • Read local bmp picture and write it to buffer

Linux platform like Jetson Nano and Raspberry Pi support to directly operate bmp pictures
Raspberry Pi & Jetson Nano:RaspberryPi&JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)

UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
Parameters:
	path:The path of BMP pictures
 	Xstart: X coordination of left-top of picture, default 0;
 	Ystart: Y coordination of left-top of picture, default 0;

Testing code

In the above part, we describe the tree structures of Linux codes, here we talk about the testing code for user.
Raspberry Pi & Jetson Nano: RaspberryPi&JetsonNano\c\examples. The codes in examples are testing code, you can modify the definition in main.c file for different types of e-Paper.

For example, if you want to test 2.13inch e-paper, you need to delete the "//" symbol on line 32.

// EPD_2in13_V2_test();

Change it to

EPD_2in13_V2_test();

Then compile it again and run

make clean
make
sudo ./epd

Python(Can be used for Jetson Nano\Raspberry Pi)

It is compatible with python2.7 and python3
python is easy to use than c codes
Raspberry Pi and Jetson Nano:RaspberryPi&JetsonNano\python\lib\

epdconfig.py

  • Initialize module and exit handle:
def module_init()
def module_exit()

Note: 1.The functions are used to set GPIP before and after driving e-Paper. 2.If the board you have is printed with Rev2.1, module enter low-ultra mode after Module_Exit(). (as we test, the current is about 0 in this mode);

  • GPIO Read/Write:
def  digital_write(pin, value)
def  digital_read(pin)
  • SPI Write data:
def spi_writebyte(data)

epdxxx.py(xxx is the type of e-Paper)

  • Initailize e-paper: this function should be used at the begining. It can also be used to wake up e-Paper from Sleep mode.
#For 2.13inch e-Paper、2.9inch e-Paper
def init(self, update) #  Choose lut_full_update or lut_partial_update
#Other type
def init(self)
  • Clear e-paper: This function is used to clear e-Paper to white;
def Clear(self)
def Clear(self, color) # Some types of e-Paper should use this function to clear screen
  • Convert image to arrays
def getbuffer(self, image)
  • Transmit one frame of image data and display
#For two-color e-paper
def display(self, image)

#Because that controllers of 2.13inch e-paper are updated, when partial refresh, they should first use displayPartBaseImage() to display static background, then use displayPart() to dynamaticlly display.
def displayPartBaseImage(self, image)
def displayPart(self, image)
  • Enter sleep mode
def sleep(self)

epd_xxx_test.py(xxx is type of e-paper)

python examples are saved in directory:
Raspberry Pi和Jetson Nano:RaspberryPi&JetsonNano\python\examples\

If the python installed in your OS is python2, you should run examples like below:

sudo python epd_2in13_V2_test.py

If it is python3, the commands should be:

sudo python3 epd_2in13-V2_test.py

Orientation

To rotate the display, you can use transpose function like blackimage = blackimage.transpose(Image.ROTATE_270):

blackimage = blackimage.transpose(Image.ROTATE_270) 
redimage = redimage.transpose(Image.ROTATE_270)
#Support ROTATE_90, ROTATE_180, ROTATE_270


GUI

Python has a powerful PIL library PIL link, which can be used directly to drawing figures. Here we use it for drawing

  • Install the library firstly
sudo apt-get install python3-pil 

Import the library

from PIL import Image,ImageDraw,ImageFont

Image: library; ImageDraw: drawing function; ImageFont: fonts

  • Set image buffer for drawing.
image = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame

The first parameter is the depth of color, 1 means 2 grayscale. The second parameter is a tuple of image size. The third parameter is color of the image, 0 is black and 255 is white.

  • Create an image object.
draw = ImageDraw.Draw(image)
  • Draw rectangle
draw.rectangle((0, 10, 200, 34), fill = 0)

The first parameter is a tuple of coordination. 0, 10 is the top-left point of rectangle, 200, 34) is the right-bottom point. fille = 0 set the filled color to black.

  • Draw line
draw.line((16, 60, 56, 60), fill = 0)

The first parameter is a type of coordination, 16, 60 is the begin point, 200, 34 is the end point. fill=0 set the line to black

  • Draw circle
draw.arc((90, 60, 150, 120), 0, 360, fill = 0)

This function is used to draw a encircle of a square. The first parameter is a tuple of coordination of the square. the degree of the circle is 0 to 360 °, fille=0 set the circle to black.
If the figure is not square according to the coordination, you will get an ellipse.。

Besides the arc function, you can also use chord function for drawing solid circle.

draw.chord((90, 130, 150, 190), 0, 360, fill = 0)

The first parameter is the coordination of the enclosing rectangle. The second and third parameters are the beginning and end degrees of the circle. The fourth parameter is the fill color of the circle.

  • Character

You can directkt import ImageFont model for drawing characters:

font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)

You can use the fonts of Windows or other fonts which is in ttc format.

To draw English character, you can directly use the fonts; for Chinese character, you need to add a symbol u:

draw.text((8, 12), 'hello world', font = font, fill = 255)
draw.text((8, 36), u'电子墨水屏', font = font, fill = 0)

The first parameter is a tuple of coordination of character, the second parameter is the font and las one is set the color.

  • Read local picture
image = Image.open(os.path.join(picdir, '2in13-v2.bmp'))

The parameter is the path of picture.

  • Other functions.

For more information about the PIL library, please refer to http://effbot.org/imagingbook.