892 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			892 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "example.h"
 | 
						||
 | 
						||
#include <time.h> 
 | 
						||
#include <sys/types.h>
 | 
						||
#include <sys/stat.h>
 | 
						||
#include <unistd.h>
 | 
						||
#include <fcntl.h>
 | 
						||
#include <stdlib.h>
 | 
						||
 | 
						||
#include "../lib/e-Paper/EPD_IT8951.h"
 | 
						||
#include "../lib/GUI/GUI_Paint.h"
 | 
						||
#include "../lib/GUI/GUI_BMPfile.h"
 | 
						||
#include "../lib/Config/Debug.h"
 | 
						||
 | 
						||
UBYTE *Refresh_Frame_Buf = NULL;
 | 
						||
 | 
						||
UBYTE *Panel_Frame_Buf = NULL;
 | 
						||
UBYTE *Panel_Area_Frame_Buf = NULL;
 | 
						||
 | 
						||
bool Four_Byte_Align = false;
 | 
						||
 | 
						||
extern int epd_mode;
 | 
						||
extern UWORD VCOM;
 | 
						||
extern UBYTE isColor;
 | 
						||
/******************************************************************************
 | 
						||
function: Change direction of display, Called after Paint_NewImage()
 | 
						||
parameter:
 | 
						||
    mode: display mode
 | 
						||
******************************************************************************/
 | 
						||
static void Epd_Mode(int mode)
 | 
						||
{
 | 
						||
	if(mode == 3) {
 | 
						||
		Paint_SetRotate(ROTATE_0);
 | 
						||
		Paint_SetMirroring(MIRROR_NONE);
 | 
						||
		isColor = 1;
 | 
						||
	}else if(mode == 2) {
 | 
						||
		Paint_SetRotate(ROTATE_0);
 | 
						||
		Paint_SetMirroring(MIRROR_HORIZONTAL);
 | 
						||
	}else if(mode == 1) {
 | 
						||
		Paint_SetRotate(ROTATE_0);
 | 
						||
		Paint_SetMirroring(MIRROR_HORIZONTAL);
 | 
						||
	}else {
 | 
						||
		Paint_SetRotate(ROTATE_0);
 | 
						||
		Paint_SetMirroring(MIRROR_NONE);
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: Display_ColorPalette_Example
 | 
						||
parameter:
 | 
						||
    Panel_Width: Width of the panel
 | 
						||
    Panel_Height: Height of the panel
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
******************************************************************************/
 | 
						||
UBYTE Display_ColorPalette_Example(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Init_Target_Memory_Addr){
 | 
						||
    UWORD In_4bp_Refresh_Area_Width;
 | 
						||
    if(Four_Byte_Align == true){
 | 
						||
        In_4bp_Refresh_Area_Width = Panel_Width - (Panel_Width % 32);
 | 
						||
    }else{
 | 
						||
        In_4bp_Refresh_Area_Width = Panel_Width;
 | 
						||
    }
 | 
						||
    UWORD In_4bp_Refresh_Area_Height = Panel_Height/16;
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    clock_t In_4bp_Refresh_Start, In_4bp_Refresh_Finish;
 | 
						||
    double In_4bp_Refresh_Duration;
 | 
						||
 | 
						||
    Imagesize  = ((In_4bp_Refresh_Area_Width*4 % 8 == 0)? (In_4bp_Refresh_Area_Width*4 / 8 ): (In_4bp_Refresh_Area_Width*4 / 8 + 1)) * In_4bp_Refresh_Area_Height;
 | 
						||
 | 
						||
    if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for black memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Debug("Start to demostrate 4bpp palette example\r\n");
 | 
						||
    In_4bp_Refresh_Start = clock();
 | 
						||
 | 
						||
    UBYTE SixteenColorPattern[16] = {0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00};
 | 
						||
 | 
						||
    for(int i=0; i < 16; i++){
 | 
						||
        memset(Refresh_Frame_Buf, SixteenColorPattern[i], Imagesize);
 | 
						||
        EPD_IT8951_4bp_Refresh(Refresh_Frame_Buf, 0, i * In_4bp_Refresh_Area_Height, In_4bp_Refresh_Area_Width, In_4bp_Refresh_Area_Height, false, Init_Target_Memory_Addr, false);
 | 
						||
    }
 | 
						||
 | 
						||
    In_4bp_Refresh_Finish = clock();
 | 
						||
    In_4bp_Refresh_Duration = (double)(In_4bp_Refresh_Finish - In_4bp_Refresh_Start) / CLOCKS_PER_SEC;
 | 
						||
    Debug( "Write and Show 4bp occupy %f second\n", In_4bp_Refresh_Duration );
 | 
						||
 | 
						||
    if(Refresh_Frame_Buf != NULL){
 | 
						||
        free(Refresh_Frame_Buf);
 | 
						||
        Refresh_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: Display_CharacterPattern_Example
 | 
						||
parameter:
 | 
						||
    Panel_Width: Width of the panel
 | 
						||
    Panel_Height: Height of the panel
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
    BitsPerPixel: Bits Per Pixel, 2^BitsPerPixel = grayscale
 | 
						||
******************************************************************************/
 | 
						||
UBYTE Display_CharacterPattern_Example(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Init_Target_Memory_Addr, UBYTE BitsPerPixel){
 | 
						||
    UWORD Display_Area_Width;
 | 
						||
    if(Four_Byte_Align == true){
 | 
						||
        Display_Area_Width = Panel_Width - (Panel_Width % 32);
 | 
						||
    }else{
 | 
						||
        Display_Area_Width = Panel_Width;
 | 
						||
    }
 | 
						||
    UWORD Display_Area_Height = Panel_Height;
 | 
						||
 | 
						||
    UWORD Display_Area_Sub_Width = Display_Area_Width / 5;
 | 
						||
    UWORD Display_Area_Sub_Height = Display_Area_Height / 5;
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    Imagesize = ((Display_Area_Width * BitsPerPixel % 8 == 0)? (Display_Area_Width * BitsPerPixel / 8 ): (Display_Area_Width * BitsPerPixel / 8 + 1)) * Display_Area_Height;
 | 
						||
    if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for image memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Paint_NewImage(Refresh_Frame_Buf, Display_Area_Width, Display_Area_Height, 0, BLACK);
 | 
						||
    Paint_SelectImage(Refresh_Frame_Buf);
 | 
						||
	Epd_Mode(epd_mode);
 | 
						||
    Paint_SetBitsPerPixel(BitsPerPixel);
 | 
						||
    Paint_Clear(WHITE);
 | 
						||
    
 | 
						||
 | 
						||
    for(int y=20; y<Display_Area_Height - Display_Area_Sub_Height; y += Display_Area_Sub_Height )//To prevent arrays from going out of bounds
 | 
						||
    {
 | 
						||
        for(int  x=20; x<Display_Area_Width - Display_Area_Sub_Width; x += Display_Area_Sub_Width )//To prevent arrays from going out of bounds
 | 
						||
        {
 | 
						||
            //For color definition of all BitsPerPixel, you can refer to GUI_Paint.h
 | 
						||
            Paint_DrawPoint(x+Display_Area_Sub_Width*3/8, y+Display_Area_Sub_Height*3/8, 0x10, DOT_PIXEL_7X7, DOT_STYLE_DFT);
 | 
						||
            Paint_DrawPoint(x+Display_Area_Sub_Width*5/8, y+Display_Area_Sub_Height*3/8, 0x30, DOT_PIXEL_7X7, DOT_STYLE_DFT);
 | 
						||
            Paint_DrawLine(x+Display_Area_Sub_Width*3/8, y+Display_Area_Sub_Height*5/8, x+Display_Area_Sub_Width*5/8, y+Display_Area_Sub_Height*5/8, 0x50, DOT_PIXEL_3X3, LINE_STYLE_SOLID);
 | 
						||
            Paint_DrawRectangle(x, y, x+Display_Area_Sub_Width, y+Display_Area_Sub_Height, 0x00, DOT_PIXEL_3X3, DRAW_FILL_EMPTY);
 | 
						||
            Paint_DrawCircle(x + Display_Area_Sub_Width/2, y + Display_Area_Sub_Height/2, Display_Area_Sub_Height/2, 0x50, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
 | 
						||
            Paint_DrawNum(x+Display_Area_Sub_Width*3/10, y+Display_Area_Sub_Height*1/4, 1234567890, &Font16, 0x20, 0xE0);
 | 
						||
            Paint_DrawString_EN(x+Display_Area_Sub_Width*3/10, y+Display_Area_Sub_Height*3/4, "hello world", &Font16, 0x30, 0xD0);
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
    switch(BitsPerPixel){
 | 
						||
        case BitsPerPixel_8:{
 | 
						||
            EPD_IT8951_8bp_Refresh(Refresh_Frame_Buf, 0, 0, Display_Area_Width,  Display_Area_Height, false, Init_Target_Memory_Addr);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_4:{
 | 
						||
            EPD_IT8951_4bp_Refresh(Refresh_Frame_Buf, 0, 0, Display_Area_Width,  Display_Area_Height, false, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_2:{
 | 
						||
            EPD_IT8951_2bp_Refresh(Refresh_Frame_Buf, 0, 0, Display_Area_Width,  Display_Area_Height, false, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_1:{
 | 
						||
            EPD_IT8951_1bp_Refresh(Refresh_Frame_Buf, 0, 0, Display_Area_Width,  Display_Area_Height, A2_Mode, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    if(Refresh_Frame_Buf != NULL){
 | 
						||
        free(Refresh_Frame_Buf);
 | 
						||
        Refresh_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: Display_BMP_Example
 | 
						||
parameter:
 | 
						||
    Panel_Width: Width of the panel
 | 
						||
    Panel_Height: Height of the panel
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
    BitsPerPixel: Bits Per Pixel, 2^BitsPerPixel = grayscale
 | 
						||
******************************************************************************/
 | 
						||
UBYTE Display_BMP_Example(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Init_Target_Memory_Addr, UBYTE BitsPerPixel, char *Path){
 | 
						||
    UWORD WIDTH;
 | 
						||
    if(Four_Byte_Align == true){
 | 
						||
        WIDTH  = Panel_Width - (Panel_Width % 32);
 | 
						||
    }else{
 | 
						||
        WIDTH = Panel_Width;
 | 
						||
    }
 | 
						||
    UWORD HEIGHT = Panel_Height;
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    Imagesize = ((WIDTH * BitsPerPixel % 8 == 0)? (WIDTH * BitsPerPixel / 8 ): (WIDTH * BitsPerPixel / 8 + 1)) * HEIGHT;
 | 
						||
    if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for black memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Paint_NewImage(Refresh_Frame_Buf, WIDTH, HEIGHT, 0, BLACK);
 | 
						||
    Paint_SelectImage(Refresh_Frame_Buf);
 | 
						||
	Epd_Mode(epd_mode);
 | 
						||
    Paint_SetBitsPerPixel(BitsPerPixel);
 | 
						||
    Paint_Clear(WHITE);
 | 
						||
 | 
						||
    // sprintf(Path,"./pic/%dx%d_0.bmp", WIDTH, HEIGHT);
 | 
						||
 | 
						||
    GUI_ReadBmp(Path, 0, 0);
 | 
						||
 | 
						||
    //you can draw your character and pattern on the image, for color definition of all BitsPerPixel, you can refer to GUI_Paint.h, 
 | 
						||
    //Paint_DrawRectangle(50, 50, WIDTH/2, HEIGHT/2, 0x30, DOT_PIXEL_3X3, DRAW_FILL_EMPTY);
 | 
						||
    //Paint_DrawCircle(WIDTH*3/4, HEIGHT/4, 100, 0xF0, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
 | 
						||
    //Paint_DrawNum(WIDTH/4, HEIGHT/5, 709, &Font20, 0x30, 0xB0);
 | 
						||
 | 
						||
    switch(BitsPerPixel){
 | 
						||
        case BitsPerPixel_8:{
 | 
						||
            Paint_DrawString_EN(10, 10, "8 bits per pixel 16 grayscale", &Font24, 0xF0, 0x00);
 | 
						||
            EPD_IT8951_8bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, false, Init_Target_Memory_Addr);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_4:{
 | 
						||
            //Paint_DrawString_EN(10, 10, "4 bits per pixel 16 grayscale", &Font24, 0xF0, 0x00);
 | 
						||
            EPD_IT8951_4bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, false, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_2:{
 | 
						||
            Paint_DrawString_EN(10, 10, "2 bits per pixel 4 grayscale", &Font24, 0xC0, 0x00);
 | 
						||
            EPD_IT8951_2bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, false, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_1:{
 | 
						||
            Paint_DrawString_EN(10, 10, "1 bit per pixel 2 grayscale", &Font24, 0x80, 0x00);
 | 
						||
            EPD_IT8951_1bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, A2_Mode, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    if(Refresh_Frame_Buf != NULL){
 | 
						||
        free(Refresh_Frame_Buf);
 | 
						||
        Refresh_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    DEV_Delay_ms(5000);
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: Dynamic_Refresh_Example
 | 
						||
parameter:
 | 
						||
    Dev_Info: Information structure read from IT8951
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
******************************************************************************/
 | 
						||
UBYTE Dynamic_Refresh_Example(IT8951_Dev_Info Dev_Info, UDOUBLE Init_Target_Memory_Addr){
 | 
						||
    UWORD Panel_Width = Dev_Info.Panel_W;
 | 
						||
    UWORD Panel_Height = Dev_Info.Panel_H;
 | 
						||
 | 
						||
    UWORD Dynamic_Area_Width = 96;
 | 
						||
    UWORD Dynamic_Area_Height = 48;
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    UWORD Start_X = 0,Start_Y = 0;
 | 
						||
 | 
						||
    UWORD Dynamic_Area_Count = 0;
 | 
						||
 | 
						||
    UWORD Repeat_Area_Times = 0;
 | 
						||
 | 
						||
    //malloc enough memory for 1bp picture first
 | 
						||
    Imagesize = ((Panel_Width * 1 % 8 == 0)? (Panel_Width * 1 / 8 ): (Panel_Width * 1 / 8 + 1)) * Panel_Height;
 | 
						||
    if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL){
 | 
						||
        Debug("Failed to apply for picture memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    clock_t Dynamic_Area_Start, Dynamic_Area_Finish;
 | 
						||
    double Dynamic_Area_Duration;  
 | 
						||
 | 
						||
    while(1)
 | 
						||
    {
 | 
						||
        Dynamic_Area_Width = 128;
 | 
						||
        Dynamic_Area_Height = 96;
 | 
						||
 | 
						||
        Start_X = 0;
 | 
						||
        Start_Y = 0;
 | 
						||
 | 
						||
        Dynamic_Area_Count = 0;
 | 
						||
 | 
						||
        Dynamic_Area_Start = clock();
 | 
						||
        Debug("Start to dynamic display...\r\n");
 | 
						||
 | 
						||
        for(Dynamic_Area_Width = 96, Dynamic_Area_Height = 64; (Dynamic_Area_Width < Panel_Width - 32) && (Dynamic_Area_Height < Panel_Height - 24); Dynamic_Area_Width += 32, Dynamic_Area_Height += 24)
 | 
						||
        {
 | 
						||
 | 
						||
            Imagesize = ((Dynamic_Area_Width % 8 == 0)? (Dynamic_Area_Width / 8 ): (Dynamic_Area_Width / 8 + 1)) * Dynamic_Area_Height;
 | 
						||
            Paint_NewImage(Refresh_Frame_Buf, Dynamic_Area_Width, Dynamic_Area_Height, 0, BLACK);
 | 
						||
            Paint_SelectImage(Refresh_Frame_Buf);
 | 
						||
			Epd_Mode(epd_mode);
 | 
						||
            Paint_SetBitsPerPixel(1);
 | 
						||
 | 
						||
           for(int y=Start_Y; y< Panel_Height - Dynamic_Area_Height; y += Dynamic_Area_Height)
 | 
						||
            {
 | 
						||
                for(int x=Start_X; x< Panel_Width - Dynamic_Area_Width; x += Dynamic_Area_Width)
 | 
						||
                {
 | 
						||
                    Paint_Clear(WHITE);
 | 
						||
 | 
						||
                    //For color definition of all BitsPerPixel, you can refer to GUI_Paint.h
 | 
						||
                    Paint_DrawRectangle(0, 0, Dynamic_Area_Width-1, Dynamic_Area_Height, 0x00, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
 | 
						||
 | 
						||
                    Paint_DrawCircle(Dynamic_Area_Width*3/4, Dynamic_Area_Height*3/4, 5, 0x00, DOT_PIXEL_1X1, DRAW_FILL_FULL);
 | 
						||
 | 
						||
                    Paint_DrawNum(Dynamic_Area_Width/4, Dynamic_Area_Height/4, ++Dynamic_Area_Count, &Font20, 0x00, 0xF0);
 | 
						||
 | 
						||
					if(epd_mode == 2)
 | 
						||
						EPD_IT8951_1bp_Refresh(Refresh_Frame_Buf, 1280-Dynamic_Area_Width-x, y, Dynamic_Area_Width,  Dynamic_Area_Height, A2_Mode, Init_Target_Memory_Addr, true);
 | 
						||
					else if(epd_mode == 1)
 | 
						||
						EPD_IT8951_1bp_Refresh(Refresh_Frame_Buf, Panel_Width-Dynamic_Area_Width-x-16, y, Dynamic_Area_Width,  Dynamic_Area_Height, A2_Mode, Init_Target_Memory_Addr, true);
 | 
						||
                    else
 | 
						||
						EPD_IT8951_1bp_Refresh(Refresh_Frame_Buf, x, y, Dynamic_Area_Width,  Dynamic_Area_Height, A2_Mode, Init_Target_Memory_Addr, true);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            Start_X += 32;
 | 
						||
            Start_Y += 24;
 | 
						||
        }
 | 
						||
 | 
						||
        Dynamic_Area_Finish = clock();
 | 
						||
        Dynamic_Area_Duration = (double)(Dynamic_Area_Finish - Dynamic_Area_Start) / CLOCKS_PER_SEC;
 | 
						||
        Debug( "Write and Show occupy %f second\n", Dynamic_Area_Duration );
 | 
						||
 | 
						||
        Repeat_Area_Times ++;
 | 
						||
        if(Repeat_Area_Times > 0){
 | 
						||
            break;
 | 
						||
        }
 | 
						||
    }
 | 
						||
    if(Refresh_Frame_Buf != NULL){
 | 
						||
        free(Refresh_Frame_Buf);
 | 
						||
        Refresh_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: Dynamic_GIF_Example
 | 
						||
parameter:
 | 
						||
    Panel_Width: Width of the panel
 | 
						||
    Panel_Height: Height of the panel
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
    BitsPerPixel: Bits Per Pixel, 2^BitsPerPixel = grayscale
 | 
						||
******************************************************************************/
 | 
						||
UBYTE Dynamic_GIF_Example(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Init_Target_Memory_Addr){
 | 
						||
 | 
						||
    UWORD Animation_Start_X = 0;
 | 
						||
    UWORD Animation_Start_Y = 0;
 | 
						||
    UWORD Animation_Area_Width = 800;
 | 
						||
    UWORD Animation_Area_Height = 600;
 | 
						||
 | 
						||
    if(Animation_Area_Width > Panel_Width){
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
    if(Animation_Area_Height > Panel_Height){
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    UBYTE Pic_Count = 0;
 | 
						||
    UBYTE Pic_Num = 7;
 | 
						||
    char Path[30];
 | 
						||
 | 
						||
    UDOUBLE Basical_Memory_Addr = Init_Target_Memory_Addr;
 | 
						||
 | 
						||
    UDOUBLE Target_Memory_Addr = Basical_Memory_Addr;
 | 
						||
    UWORD Repeat_Animation_Times = 0;
 | 
						||
 | 
						||
    clock_t Animation_Test_Start, Animation_Test_Finish;
 | 
						||
    double Animation_Test_Duration;
 | 
						||
 | 
						||
    Imagesize = ((Animation_Area_Width * 1 % 8 == 0)? (Animation_Area_Width * 1 / 8 ): (Animation_Area_Width * 1 / 8 + 1)) * Animation_Area_Height;
 | 
						||
 | 
						||
    if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL){
 | 
						||
        Debug("Failed to apply for image memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Paint_NewImage(Refresh_Frame_Buf, Animation_Area_Width, Animation_Area_Height, 0, BLACK);
 | 
						||
    Paint_SelectImage(Refresh_Frame_Buf);
 | 
						||
	Epd_Mode(epd_mode);
 | 
						||
    Paint_SetBitsPerPixel(1);
 | 
						||
 | 
						||
    Debug("Start to write a animation\r\n");
 | 
						||
    Animation_Test_Start = clock();
 | 
						||
    for(int i=0; i < Pic_Num; i += 1){
 | 
						||
        Paint_Clear(WHITE);
 | 
						||
        sprintf(Path,"./pic/800x600_gif_%d.bmp",Pic_Count++);
 | 
						||
        GUI_ReadBmp(Path, 0, 0);
 | 
						||
        //For color definition of all BitsPerPixel, you can refer to GUI_Paint.h
 | 
						||
        Paint_DrawNum(10, 10, i+1, &Font16, 0x00, 0xF0);
 | 
						||
		if(epd_mode == 2)
 | 
						||
			EPD_IT8951_1bp_Multi_Frame_Write(Refresh_Frame_Buf, 1280-Animation_Area_Width+Animation_Start_X, Animation_Start_Y, Animation_Area_Width,  Animation_Area_Height, Target_Memory_Addr,false);
 | 
						||
        else if(epd_mode == 1)
 | 
						||
			EPD_IT8951_1bp_Multi_Frame_Write(Refresh_Frame_Buf, Panel_Width-Animation_Area_Width+Animation_Start_X-16, Animation_Start_Y, Animation_Area_Width,  Animation_Area_Height, Target_Memory_Addr,false);
 | 
						||
		else
 | 
						||
			EPD_IT8951_1bp_Multi_Frame_Write(Refresh_Frame_Buf, Animation_Start_X, Animation_Start_Y, Animation_Area_Width,  Animation_Area_Height, Target_Memory_Addr,false);
 | 
						||
        Target_Memory_Addr += Imagesize;
 | 
						||
    }
 | 
						||
 | 
						||
    Animation_Test_Finish = clock();
 | 
						||
    Animation_Test_Duration = (double)(Animation_Test_Finish - Animation_Test_Start) / CLOCKS_PER_SEC;
 | 
						||
	Debug( "Write all frame occupy %f second\r\n", Animation_Test_Duration);
 | 
						||
 | 
						||
    Target_Memory_Addr = Basical_Memory_Addr;
 | 
						||
 | 
						||
    while(1){
 | 
						||
        Debug("Start to show a animation\r\n");
 | 
						||
        Animation_Test_Start = clock();
 | 
						||
 | 
						||
        for(int i=0; i< Pic_Num; i += 1){
 | 
						||
			if(epd_mode == 2)
 | 
						||
				EPD_IT8951_1bp_Multi_Frame_Refresh(Panel_Width-Animation_Area_Width+Animation_Start_X, Animation_Start_Y, Animation_Area_Width,  Animation_Area_Height, Target_Memory_Addr);
 | 
						||
			else if(epd_mode == 1)
 | 
						||
				EPD_IT8951_1bp_Multi_Frame_Refresh(Panel_Width-Animation_Area_Width+Animation_Start_X-16, Animation_Start_Y, Animation_Area_Width,  Animation_Area_Height, Target_Memory_Addr);
 | 
						||
            else
 | 
						||
				EPD_IT8951_1bp_Multi_Frame_Refresh(Animation_Start_X, Animation_Start_Y, Animation_Area_Width,  Animation_Area_Height, Target_Memory_Addr);
 | 
						||
            Target_Memory_Addr += Imagesize;
 | 
						||
        }
 | 
						||
        Target_Memory_Addr = Basical_Memory_Addr;
 | 
						||
 | 
						||
        Animation_Test_Finish = clock();
 | 
						||
        Animation_Test_Duration = (double)(Animation_Test_Finish - Animation_Test_Start) / CLOCKS_PER_SEC;
 | 
						||
        Debug( "Show all frame occupy %f second\r\n", Animation_Test_Duration );
 | 
						||
 | 
						||
        Repeat_Animation_Times ++;
 | 
						||
        if(Repeat_Animation_Times >15){
 | 
						||
            break;
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    if(Refresh_Frame_Buf != NULL){
 | 
						||
        free(Refresh_Frame_Buf);
 | 
						||
        Refresh_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: Check_FrameRate_Example
 | 
						||
parameter:
 | 
						||
    Panel_Width: Width of the panel
 | 
						||
    Panel_Height: Height of the panel
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
    BitsPerPixel: Bits Per Pixel, 2^BitsPerPixel = grayscale
 | 
						||
******************************************************************************/
 | 
						||
UBYTE Check_FrameRate_Example(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Target_Memory_Addr, UBYTE BitsPerPixel){
 | 
						||
    UWORD Frame_Rate_Test_Width;
 | 
						||
    if(Four_Byte_Align == true){
 | 
						||
        Frame_Rate_Test_Width = Panel_Width - (Panel_Width % 32);
 | 
						||
    }else{
 | 
						||
        Frame_Rate_Test_Width = Panel_Width;
 | 
						||
    }
 | 
						||
    UWORD Frame_Rate_Test_Height = Panel_Height;
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    UBYTE *Refresh_FrameRate_Buf = NULL;
 | 
						||
 | 
						||
    UBYTE Count = 0;
 | 
						||
 | 
						||
    clock_t Frame_Rate_Test_Start, Frame_Rate_Test_Finish;
 | 
						||
    double Frame_Rate_Test_Duration;
 | 
						||
 | 
						||
    Imagesize = ((Frame_Rate_Test_Width * BitsPerPixel % 8 == 0)? (Frame_Rate_Test_Width * BitsPerPixel / 8 ): (Frame_Rate_Test_Width * BitsPerPixel / 8 + 1)) * Frame_Rate_Test_Height;
 | 
						||
 | 
						||
    if((Refresh_FrameRate_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for image memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Paint_NewImage(Refresh_FrameRate_Buf, Frame_Rate_Test_Width, Frame_Rate_Test_Height, 0, BLACK);
 | 
						||
    Paint_SelectImage(Refresh_FrameRate_Buf);
 | 
						||
	Epd_Mode(epd_mode);
 | 
						||
    Paint_SetBitsPerPixel(BitsPerPixel);
 | 
						||
 | 
						||
    Debug("Start to test Frame Rate\r\n");
 | 
						||
    Frame_Rate_Test_Start = clock();
 | 
						||
 | 
						||
    for(int i=0; i<10; i++){
 | 
						||
 | 
						||
        Paint_Clear(WHITE);
 | 
						||
        //For color definition of all BitsPerPixel, you can refer to GUI_Paint.h
 | 
						||
        Paint_DrawRectangle(20, 20, Frame_Rate_Test_Width-20, Frame_Rate_Test_Height-20, 0x00, DOT_PIXEL_4X4, DRAW_FILL_EMPTY);//To prevent arrays from going out of bounds
 | 
						||
        Paint_DrawNum(Frame_Rate_Test_Width/2, Frame_Rate_Test_Height/2, ++Count, &Font24, 0x00, 0xF0);
 | 
						||
        Paint_DrawString_EN(Frame_Rate_Test_Width/2, Frame_Rate_Test_Height/4, "frame rate test", &Font20, 0xF0, 0x00);
 | 
						||
        Paint_DrawString_EN(Frame_Rate_Test_Width/2, Frame_Rate_Test_Height*3/4, "frame rate test", &Font20, 0xF0, 0x00);
 | 
						||
 | 
						||
        switch(BitsPerPixel){
 | 
						||
            case 8:{
 | 
						||
				if(epd_mode == 2)
 | 
						||
					EPD_IT8951_8bp_Refresh(Refresh_FrameRate_Buf, 1280-Frame_Rate_Test_Width, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr);
 | 
						||
				else if(epd_mode == 1)
 | 
						||
					EPD_IT8951_8bp_Refresh(Refresh_FrameRate_Buf, 1872-Frame_Rate_Test_Width-16, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr);
 | 
						||
				else					
 | 
						||
					EPD_IT8951_8bp_Refresh(Refresh_FrameRate_Buf, 0, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr);
 | 
						||
                break;
 | 
						||
            }
 | 
						||
            case 4:{
 | 
						||
				if(epd_mode == 2)
 | 
						||
					EPD_IT8951_4bp_Refresh(Refresh_FrameRate_Buf, 1280-Frame_Rate_Test_Width, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr,false);
 | 
						||
				else if(epd_mode == 1)
 | 
						||
					EPD_IT8951_4bp_Refresh(Refresh_FrameRate_Buf, 1872-Frame_Rate_Test_Width-16, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr,false);
 | 
						||
				else
 | 
						||
					EPD_IT8951_4bp_Refresh(Refresh_FrameRate_Buf, 0, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr,false);
 | 
						||
                break;
 | 
						||
            }
 | 
						||
            case 2:{
 | 
						||
				if(epd_mode == 2)
 | 
						||
					EPD_IT8951_2bp_Refresh(Refresh_FrameRate_Buf, 1280-Frame_Rate_Test_Width, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr,false);
 | 
						||
				else if(epd_mode == 1)
 | 
						||
					EPD_IT8951_2bp_Refresh(Refresh_FrameRate_Buf, 1872-Frame_Rate_Test_Width-16, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr,false);
 | 
						||
				else	
 | 
						||
					EPD_IT8951_2bp_Refresh(Refresh_FrameRate_Buf, 0, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, false, Target_Memory_Addr,false);
 | 
						||
                break;
 | 
						||
            }
 | 
						||
            case 1:{
 | 
						||
				if(epd_mode == 2)
 | 
						||
					EPD_IT8951_1bp_Refresh(Refresh_FrameRate_Buf, 1280-Frame_Rate_Test_Width, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, A2_Mode, Target_Memory_Addr,false);
 | 
						||
				else if(epd_mode == 1)
 | 
						||
					EPD_IT8951_1bp_Refresh(Refresh_FrameRate_Buf, 1872-Frame_Rate_Test_Width-16, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, A2_Mode, Target_Memory_Addr,false);
 | 
						||
				else	
 | 
						||
					EPD_IT8951_1bp_Refresh(Refresh_FrameRate_Buf, 0, 0, Frame_Rate_Test_Width,  Frame_Rate_Test_Height, A2_Mode, Target_Memory_Addr,false);
 | 
						||
                break;
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    Frame_Rate_Test_Finish = clock();
 | 
						||
    Frame_Rate_Test_Duration = (double)(Frame_Rate_Test_Finish - Frame_Rate_Test_Start) / CLOCKS_PER_SEC;
 | 
						||
	Debug( "Write and Show 10 Frame occupy %f second\r\n", Frame_Rate_Test_Duration);
 | 
						||
    Debug( "The frame rate is: %lf fps\r\n", 10/Frame_Rate_Test_Duration);
 | 
						||
 | 
						||
    if(Refresh_FrameRate_Buf != NULL){
 | 
						||
        free(Refresh_FrameRate_Buf);
 | 
						||
        Refresh_FrameRate_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
/******************************************************************************
 | 
						||
function: TouchPanel_ePaper_Example
 | 
						||
parameter:
 | 
						||
    Panel_Width: Width of the panel
 | 
						||
    Panel_Height: Height of the panel
 | 
						||
    Init_Target_Memory_Addr: Memory address of IT8951 target memory address
 | 
						||
******************************************************************************/
 | 
						||
UBYTE TouchPanel_ePaper_Example(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Init_Target_Memory_Addr){
 | 
						||
    int ret,fd;
 | 
						||
    UWORD Touch_Pannel_Area_Width;
 | 
						||
    if(Four_Byte_Align == true){
 | 
						||
        Touch_Pannel_Area_Width = Panel_Width - (Panel_Width % 32);
 | 
						||
    }else{
 | 
						||
        Touch_Pannel_Area_Width = Panel_Width;
 | 
						||
    }
 | 
						||
    UWORD Touch_Pannel_Area_Height = Panel_Height;
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    UWORD Touch_Point0[2];
 | 
						||
    UWORD Touch_X = 0,Touch_Y = 0;
 | 
						||
    UWORD Touch_X_Old = 0,Touch_Y_Old = 0;
 | 
						||
 | 
						||
    UWORD Min_X = Panel_Width, Max_X = 0;
 | 
						||
    UWORD Min_Y = Panel_Height, Max_Y = 0;
 | 
						||
 | 
						||
    UWORD X_Start, X_End, Y_Start, Y_End, Width, Height;
 | 
						||
 | 
						||
    UBYTE First_Point_Flag = 1;
 | 
						||
 | 
						||
    UWORD Panel_Frame_Buf_WidthByte;
 | 
						||
    UWORD Panel_Area_Frame_Buf_WidthByte;
 | 
						||
 | 
						||
	if(access("/home/pi/FIFO",F_OK)){
 | 
						||
		ret = mkfifo("/home/pi/FIFO",0777);
 | 
						||
		if(ret == -1){
 | 
						||
			Debug("mkfifo error!\n");
 | 
						||
			exit(0);
 | 
						||
		}
 | 
						||
	}
 | 
						||
    fd = open("/home/pi/FIFO",O_RDWR|O_NONBLOCK);
 | 
						||
    if( fd == -1 )
 | 
						||
    {
 | 
						||
        Debug("Open error\r\n");
 | 
						||
        exit(0);
 | 
						||
    }
 | 
						||
 | 
						||
    Panel_Frame_Buf_WidthByte =  (Touch_Pannel_Area_Width * 1 % 8 == 0) ? (Touch_Pannel_Area_Width * 1 / 8 ): (Touch_Pannel_Area_Width * 1 / 8 + 1);
 | 
						||
 | 
						||
    Imagesize = ((Touch_Pannel_Area_Width * 1 % 8 == 0) ? (Touch_Pannel_Area_Width * 1 / 8 ): (Touch_Pannel_Area_Width *1 / 8 + 1)) * Touch_Pannel_Area_Height;
 | 
						||
 | 
						||
    if((Panel_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for Panel_Frame_Buf memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    //Assume the entire screen is refreshed
 | 
						||
    if((Panel_Area_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for Panel_Area_Frame_Buf memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Paint_NewImage(Panel_Frame_Buf, Touch_Pannel_Area_Width, Touch_Pannel_Area_Height, 0, BLACK);
 | 
						||
    Paint_SelectImage(Panel_Frame_Buf);
 | 
						||
	Epd_Mode(epd_mode);
 | 
						||
    Paint_SetBitsPerPixel(1);
 | 
						||
    Paint_Clear(WHITE);
 | 
						||
 | 
						||
    while(1)
 | 
						||
    {
 | 
						||
        Min_X = Panel_Width;
 | 
						||
        Max_X = 0;
 | 
						||
        Min_Y = Panel_Height;
 | 
						||
        Max_Y = 0;
 | 
						||
 | 
						||
        First_Point_Flag = 1;
 | 
						||
 | 
						||
        ret = read(fd,Touch_Point0,sizeof(Touch_Point0));
 | 
						||
 | 
						||
        //Prepare the image
 | 
						||
        while(ret == 4){
 | 
						||
            Touch_X = Touch_Point0[0];
 | 
						||
            Touch_Y = Touch_Point0[1];
 | 
						||
            Paint_NewImage(Panel_Frame_Buf, Touch_Pannel_Area_Width, Touch_Pannel_Area_Height, 0, BLACK);
 | 
						||
            Paint_SelectImage(Panel_Frame_Buf);
 | 
						||
            Paint_SetBitsPerPixel(1);
 | 
						||
 | 
						||
            if(First_Point_Flag == 0)
 | 
						||
            {
 | 
						||
                //For color definition of all BitsPerPixel, you can refer to GUI_Paint.h
 | 
						||
                Paint_DrawLine(Touch_X_Old, Touch_Y_Old, Touch_X, Touch_Y, 0x00, DOT_PIXEL_3X3, LINE_STYLE_SOLID);
 | 
						||
            }
 | 
						||
            Touch_X_Old = Touch_X;
 | 
						||
            Touch_Y_Old = Touch_Y;
 | 
						||
            First_Point_Flag = 0;
 | 
						||
 | 
						||
            if(Touch_X < Min_X){
 | 
						||
                Min_X = Touch_X;
 | 
						||
            }
 | 
						||
            if(Touch_X > Max_X){
 | 
						||
                Max_X = Touch_X;
 | 
						||
            }
 | 
						||
            if(Touch_Y < Min_Y){
 | 
						||
                Min_Y = Touch_Y;
 | 
						||
            }
 | 
						||
            if(Touch_Y > Max_Y){
 | 
						||
                Max_Y = Touch_Y;
 | 
						||
            }
 | 
						||
 | 
						||
            DEV_Delay_ms(15);
 | 
						||
 | 
						||
            Debug("Touch_X:%d\r\n",Touch_X);
 | 
						||
            Debug("Touch_Y:%d\r\n",Touch_Y);
 | 
						||
            ret = read(fd,Touch_Point0,sizeof(Touch_Point0));
 | 
						||
            Debug("Stop ret:%d\r\n",ret);
 | 
						||
        }
 | 
						||
 | 
						||
        //If Min < Max, then Indicates that there is a refresh area
 | 
						||
        if( (Min_X<Max_X)||(Min_Y<Max_Y) )
 | 
						||
        {
 | 
						||
            //----------Calculate Data, please be cautious that the width must be 32-bit aligned----------
 | 
						||
            Debug("Min_X - Max_X Output:%d~%d\r\n",Min_X,Max_X);
 | 
						||
            Debug("Min_Y - Max_Y Output:%d~%d\r\n",Min_Y,Max_Y);
 | 
						||
 | 
						||
            X_Start = Min_X < 32 ? 0 : Min_X - (Min_X % 32);
 | 
						||
            Debug("X_Start:%d\r\n",X_Start);
 | 
						||
            X_End = ( Max_X + (32 - (Max_X % 32)) ) > Touch_Pannel_Area_Width ? ( Max_X - (Max_X % 32) )  : ( Max_X + (32 - (Max_X % 32)) );
 | 
						||
            Debug("X_End:%d\r\n",X_End);
 | 
						||
            Y_Start = Min_Y;
 | 
						||
            Debug("Y_Start:%d\r\n",Y_Start);
 | 
						||
            Y_End = Max_Y;
 | 
						||
            Debug("Y_Start:%d\r\n",Y_End);
 | 
						||
 | 
						||
            Width = X_End - X_Start;
 | 
						||
            if(Width<=0){
 | 
						||
                Width = 32;
 | 
						||
            }
 | 
						||
            Debug("Width:%d\r\n",Width);
 | 
						||
            Height = Y_End-Y_Start;
 | 
						||
            if(Height<=0){
 | 
						||
                Height = 32;
 | 
						||
            }
 | 
						||
            Debug("Height:%d\r\n",Height);
 | 
						||
 | 
						||
            //----------Prepare Image----------
 | 
						||
            Paint_NewImage(Panel_Area_Frame_Buf, Width, Height, 0, BLACK);
 | 
						||
            Paint_SelectImage(Panel_Area_Frame_Buf);
 | 
						||
			Epd_Mode(epd_mode);
 | 
						||
            Paint_Clear(WHITE);
 | 
						||
 | 
						||
            Panel_Area_Frame_Buf_WidthByte = (Width % 8 == 0) ? (Width / 8 ): (Width / 8 + 1);
 | 
						||
 | 
						||
            for(int y = 0; y< Height; y++){
 | 
						||
                memcpy(Panel_Area_Frame_Buf + (y * Panel_Area_Frame_Buf_WidthByte), Panel_Frame_Buf + ((Y_Start + y) * Panel_Frame_Buf_WidthByte) + X_Start/8 , Panel_Area_Frame_Buf_WidthByte);
 | 
						||
            }
 | 
						||
 | 
						||
            //----------Display Image----------
 | 
						||
            EPD_IT8951_1bp_Refresh(Panel_Area_Frame_Buf, X_Start, Y_Start, Width,  Height, A2_Mode, Init_Target_Memory_Addr, true);
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    if( Panel_Area_Frame_Buf != NULL ){
 | 
						||
        free(Panel_Area_Frame_Buf);
 | 
						||
        Panel_Area_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    if( Panel_Frame_Buf != NULL ){
 | 
						||
        free(Panel_Frame_Buf);
 | 
						||
        Panel_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
static UBYTE BMP_Test(UWORD Panel_Width, UWORD Panel_Height, UDOUBLE Init_Target_Memory_Addr, UBYTE BitsPerPixel, UBYTE Pic_Count)
 | 
						||
{
 | 
						||
    UWORD WIDTH;
 | 
						||
 | 
						||
    if(Four_Byte_Align == true){
 | 
						||
        WIDTH  = Panel_Width - (Panel_Width % 32);
 | 
						||
    }else{
 | 
						||
        WIDTH = Panel_Width;
 | 
						||
    }
 | 
						||
    UWORD HEIGHT = Panel_Height;
 | 
						||
 | 
						||
    UDOUBLE Imagesize;
 | 
						||
 | 
						||
    Imagesize = ((WIDTH * BitsPerPixel % 8 == 0)? (WIDTH * BitsPerPixel / 8 ): (WIDTH * BitsPerPixel / 8 + 1)) * HEIGHT;
 | 
						||
    if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize)) == NULL) {
 | 
						||
        Debug("Failed to apply for black memory...\r\n");
 | 
						||
        return -1;
 | 
						||
    }
 | 
						||
 | 
						||
    Paint_NewImage(Refresh_Frame_Buf, WIDTH, HEIGHT, 0, BLACK);
 | 
						||
    Paint_SelectImage(Refresh_Frame_Buf);
 | 
						||
	Epd_Mode(epd_mode);
 | 
						||
    Paint_SetBitsPerPixel(BitsPerPixel);
 | 
						||
    Paint_Clear(WHITE);
 | 
						||
 | 
						||
 | 
						||
	char Path[30];
 | 
						||
	sprintf(Path,"./pic/%dx%d_%d.bmp", WIDTH, HEIGHT, Pic_Count);
 | 
						||
	GUI_ReadBmp(Path, 0, 0);
 | 
						||
 | 
						||
    switch(BitsPerPixel){
 | 
						||
        case BitsPerPixel_8:{
 | 
						||
            Paint_DrawString_EN(10, 10, "8 bits per pixel 16 grayscale", &Font24, 0xF0, 0x00);
 | 
						||
            EPD_IT8951_8bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, false, Init_Target_Memory_Addr);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_4:{
 | 
						||
			Paint_DrawString_EN(10, 10, "4 bits per pixel 16 grayscale", &Font24, 0xF0, 0x00);
 | 
						||
            EPD_IT8951_4bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, false, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_2:{
 | 
						||
            Paint_DrawString_EN(10, 10, "2 bits per pixel 4 grayscale", &Font24, 0xC0, 0x00);
 | 
						||
            EPD_IT8951_2bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, false, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
        case BitsPerPixel_1:{
 | 
						||
            Paint_DrawString_EN(10, 10, "1 bit per pixel 2 grayscale", &Font24, 0x80, 0x00);
 | 
						||
            EPD_IT8951_1bp_Refresh(Refresh_Frame_Buf, 0, 0, WIDTH,  HEIGHT, A2_Mode, Init_Target_Memory_Addr,false);
 | 
						||
            break;
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    if(Refresh_Frame_Buf != NULL){
 | 
						||
        free(Refresh_Frame_Buf);
 | 
						||
        Refresh_Frame_Buf = NULL;
 | 
						||
    }
 | 
						||
 | 
						||
    DEV_Delay_ms(5000);
 | 
						||
 | 
						||
    return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
void Factory_Test_Only(IT8951_Dev_Info Dev_Info, UDOUBLE Init_Target_Memory_Addr)
 | 
						||
{
 | 
						||
    while(1)
 | 
						||
    {
 | 
						||
        for(int i=0; i < 4; i++){
 | 
						||
			EPD_IT8951_SystemRun();
 | 
						||
			
 | 
						||
			EPD_IT8951_Clear_Refresh(Dev_Info, Init_Target_Memory_Addr, GC16_Mode);
 | 
						||
            // BMP_Test(Dev_Info.Panel_W, Dev_Info.Panel_H, Init_Target_Memory_Addr, BitsPerPixel_1, i);
 | 
						||
            // BMP_Test(Dev_Info.Panel_W, Dev_Info.Panel_H, Init_Target_Memory_Addr, BitsPerPixel_2, i);
 | 
						||
            BMP_Test(Dev_Info.Panel_W, Dev_Info.Panel_H, Init_Target_Memory_Addr, BitsPerPixel_4, i);
 | 
						||
            // BMP_Test(Dev_Info.Panel_W, Dev_Info.Panel_H, Init_Target_Memory_Addr, BitsPerPixel_8, i);
 | 
						||
			EPD_IT8951_Clear_Refresh(Dev_Info, Init_Target_Memory_Addr, GC16_Mode);
 | 
						||
			
 | 
						||
			EPD_IT8951_Sleep();
 | 
						||
			DEV_Delay_ms(5000);
 | 
						||
        }
 | 
						||
		EPD_IT8951_SystemRun();
 | 
						||
		
 | 
						||
		EPD_IT8951_Clear_Refresh(Dev_Info, Init_Target_Memory_Addr, A2_Mode);
 | 
						||
        Dynamic_Refresh_Example(Dev_Info,Init_Target_Memory_Addr);
 | 
						||
		EPD_IT8951_Clear_Refresh(Dev_Info, Init_Target_Memory_Addr, A2_Mode);
 | 
						||
		
 | 
						||
		if(isColor) 
 | 
						||
			Color_Test(Dev_Info, Init_Target_Memory_Addr);
 | 
						||
		
 | 
						||
		EPD_IT8951_Sleep();
 | 
						||
		DEV_Delay_ms(5000);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
void Color_Test(IT8951_Dev_Info Dev_Info, UDOUBLE Init_Target_Memory_Addr)
 | 
						||
{
 | 
						||
	PAINT_TIME Time = {2020, 9, 30, 18, 10, 34};
 | 
						||
	
 | 
						||
	while(1) 
 | 
						||
	{
 | 
						||
		UWORD Panel_Width = Dev_Info.Panel_W;
 | 
						||
		UWORD Panel_Height = Dev_Info.Panel_H;
 | 
						||
 | 
						||
		UDOUBLE Imagesize;
 | 
						||
 | 
						||
		//malloc enough memory for 1bp picture first
 | 
						||
		Imagesize = ((Panel_Width * 1 % 8 == 0)? (Panel_Width * 1 / 8 ): (Panel_Width * 1 / 8 + 1)) * Panel_Height;
 | 
						||
		if((Refresh_Frame_Buf = (UBYTE *)malloc(Imagesize*4)) == NULL) {
 | 
						||
			Debug("Failed to apply for picture memory...\r\n");
 | 
						||
		}
 | 
						||
 | 
						||
		Paint_NewImage(Refresh_Frame_Buf, Panel_Width, Panel_Height, 0, BLACK);
 | 
						||
		Paint_SelectImage(Refresh_Frame_Buf);
 | 
						||
		Epd_Mode(epd_mode);
 | 
						||
		Paint_SetBitsPerPixel(4);
 | 
						||
		Paint_Clear(WHITE);
 | 
						||
 | 
						||
		if(0) {
 | 
						||
			Paint_DrawRectangle(100, 100, 300, 300, 0x0f00, DOT_PIXEL_1X1, DRAW_FILL_FULL);	//Red
 | 
						||
			Paint_DrawRectangle(100, 400, 300, 600, 0x00f0, DOT_PIXEL_1X1, DRAW_FILL_FULL);	//Green
 | 
						||
			Paint_DrawRectangle(100, 700, 300, 900, 0x000f, DOT_PIXEL_1X1, DRAW_FILL_FULL);	//Bule
 | 
						||
			
 | 
						||
			Paint_DrawCircle(500, 200, 100, 0x00ff, DOT_PIXEL_1X1, DRAW_FILL_FULL);
 | 
						||
			Paint_DrawCircle(500, 500, 100, 0x0f0f, DOT_PIXEL_1X1, DRAW_FILL_FULL);
 | 
						||
			Paint_DrawCircle(500, 800, 100, 0x0ff0, DOT_PIXEL_1X1, DRAW_FILL_FULL);
 | 
						||
			
 | 
						||
			Paint_DrawLine(1000, 200, 1100, 200, 0x055a, 10, LINE_STYLE_SOLID);
 | 
						||
			Paint_DrawLine(1000, 300, 1100, 300, 0x05a5, 20, LINE_STYLE_SOLID);
 | 
						||
			Paint_DrawLine(1000, 400, 1100, 400, 0x0a55, 30, LINE_STYLE_SOLID);
 | 
						||
 | 
						||
			Paint_DrawString_EN(1000, 500, "Hello, World!", &Font24, 0x0aa5, 0x0fff);
 | 
						||
			Paint_DrawString_EN(1000, 600, "Hello, World!", &Font24, 0x0a5a, 0x0fff);
 | 
						||
			Paint_DrawString_EN(1000, 700, "Hello, World!", &Font24, 0x05aa, 0x0fff);
 | 
						||
 | 
						||
			Paint_DrawString_CN(700, 400, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ѩ<CEA2><D1A9><EFBFBD><EFBFBD>", &Font24CN, 0x00fa, 0x0000);
 | 
						||
			Paint_DrawNum(700, 500, 123456789, &Font24, 0x0a0f, 0x0fff);
 | 
						||
			Paint_DrawTime(700, 600, &Time, &Font24, 0x0fa0, 0x0fff);
 | 
						||
		}else {
 | 
						||
			for(UWORD j=0; j<14; j++) {
 | 
						||
				for(UWORD i=0; i<19; i++) {
 | 
						||
					Paint_DrawRectangle(i*72, j*72+1, (i+1)*72-1, (j+1)*72, (i+j*19)*15, DOT_PIXEL_1X1, DRAW_FILL_FULL);
 | 
						||
				}
 | 
						||
			}
 | 
						||
		}
 | 
						||
 | 
						||
		EPD_IT8951_4bp_Refresh(Refresh_Frame_Buf, 0, 0, Panel_Width,  Panel_Height, false, Init_Target_Memory_Addr, false);
 | 
						||
		
 | 
						||
		if(Refresh_Frame_Buf != NULL) {
 | 
						||
			free(Refresh_Frame_Buf);
 | 
						||
			Refresh_Frame_Buf = NULL;
 | 
						||
		}
 | 
						||
 | 
						||
		DEV_Delay_ms(5000);
 | 
						||
		break;
 | 
						||
	}
 | 
						||
}
 |