Files
waveshare-panel/docs/Touch_e-Paper_Code/c/examples/2in9_TestCode.c
T

365 lines
11 KiB
C
Raw Normal View History

2026-05-07 16:28:08 -07:00
#include "Test.h"
#include "EPD_2in9_V2.h"
#include "ICNT86X.h"
#include "time.h"
extern ICNT86_Dev ICNT86_Dev_Now, ICNT86_Dev_Old;
extern int IIC_Address;
static pthread_t t1, t2;
UBYTE flag_2in9=1, dis_lock=1, dis_flag=1;
UBYTE *BlackImage, *BlackImage_ASYNC;
char *PhotoPath_S_2in9[10] = {"./pic/2in9/Photo_1_0.bmp",
"./pic/2in9/Photo_1_1.bmp", "./pic/2in9/Photo_1_2.bmp", "./pic/2in9/Photo_1_3.bmp", "./pic/2in9/Photo_1_4.bmp",
"./pic/2in9/Photo_1_5.bmp", "./pic/2in9/Photo_1_6.bmp", "./pic/2in9/Photo_1_7.bmp", "./pic/2in9/Photo_1_8.bmp",
"./pic/2in9/Photo_1_9.bmp",
};
char *PhotoPath_L_2in9[10] = {"./pic/2in9/Photo_2_0.bmp",
"./pic/2in9/Photo_2_1.bmp", "./pic/2in9/Photo_2_2.bmp", "./pic/2in9/Photo_2_3.bmp", "./pic/2in9/Photo_2_4.bmp",
"./pic/2in9/Photo_2_5.bmp", "./pic/2in9/Photo_2_6.bmp", "./pic/2in9/Photo_2_7.bmp", "./pic/2in9/Photo_2_8.bmp",
"./pic/2in9/Photo_2_9.bmp",
};
char *PagePath_2in9[4] = {"./pic/2in9/Menu.bmp", "./pic/2in9/White_board.bmp", "./pic/2in9/Photo_1.bmp", "./pic/2in9/Photo_2.bmp"};
void Handler_2in9(int signo)
{
//System Exit
printf("\r\nHandler_2in9:exit\r\n");
EPD_2IN9_V2_Sleep();
DEV_Delay_ms(1000);
flag_2in9 = 0;
pthread_join(t1, NULL);
pthread_join(t2, NULL);
DEV_ModuleExit();
exit(0);
}
void *pthread_irq_2in9(void *arg)
{
while(flag_2in9) {
if(DEV_Digital_Read(INT) == 0) {
ICNT86_Dev_Now.Touch = 1;
// printf("!");
}
else {
ICNT86_Dev_Now.Touch = 0;
}
DEV_Delay_ms(0.01);
}
printf("thread1:exit\r\n");
pthread_exit(NULL);
}
void *pthread_dis_2in9(void *arg)
{
while(flag_2in9) {
if(dis_flag) {
dis_lock = 1;
EPD_2IN9_V2_Display_Partial(BlackImage_ASYNC);
dis_flag = 0;
dis_lock = 0;
printf("ASYNC display over, unlock \r\n");
}
else {
dis_lock = 0;
}
// DEV_Delay_ms(0.01);
}
printf("thread2:exit\r\n");
pthread_exit(NULL);
}
void Show_Photo_Small_2in9(UBYTE small)
{
for(UBYTE t=1; t<7; t++) {
// printf("t= %d , small= %d \r\n", t, small);
if(small*3+t > 9) // Max image is 9
GUI_ReadBmp(PhotoPath_S_2in9[0], (t-1)%3*98+2, (t-1)/3*48+2);
else {
// printf("x is %d, y is %d \r\n", (t-1)%3*98, (t-1)/3*48);
GUI_ReadBmp(PhotoPath_S_2in9[small*3+t], (t-1)%3*98+2, (t-1)/3*48+2);
}
}
}
void Show_Photo_Large_2in9(UBYTE large)
{
if(large > 9) // Max image is 9
GUI_ReadBmp(PhotoPath_L_2in9[0], 2, 2);
else
GUI_ReadBmp(PhotoPath_L_2in9[large], 2, 2);
}
void Get_Current_Time(PAINT_TIME *pTime)
{
time_t t;
struct tm *nowtime;
time(&t);
nowtime = localtime(&t);
pTime->Year = nowtime->tm_year + 1900;
pTime->Month = nowtime->tm_mon + 1;
pTime->Day = nowtime->tm_mday;
pTime->Hour = nowtime->tm_hour;
pTime->Min = nowtime->tm_min;
}
int Test4gray_2in9(void)
{
EPD_2IN9_V2_Gray4_Init();
UWORD Imagesize = ((EPD_2IN9_V2_WIDTH % 4 == 0)? (EPD_2IN9_V2_WIDTH / 4 ): (EPD_2IN9_V2_WIDTH / 4 + 1)) * EPD_2IN9_V2_HEIGHT;
if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
printf("Failed to apply for black memory...\r\n");
return -1;
}
Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 0, WHITE);
Paint_SetScale(4);
Paint_Clear(WHITE);
GUI_ReadBmp_4Gray("./pic/2in9/2in9_Scale.bmp", 0, 0);
EPD_2IN9_V2_4GrayDisplay(BlackImage);
DEV_Delay_ms(3000);
free(BlackImage);
}
int TestCode_2in9(void)
{
IIC_Address = 0x48;
UDOUBLE i=0, j=0, k=0;
UBYTE Page=0, Photo_L=0, Photo_S=0;
UBYTE ReFlag=0, SelfFlag=0;
signal(SIGINT, Handler_2in9);
DEV_ModuleInit();
pthread_create(&t1, NULL, pthread_irq_2in9, NULL);
/*
Because the touch display requires a relatively fast refresh speed, the default
needs to use partial refresh, and four gray levels cannot be used in this mode.
Here, only four gray level picture refresh demonstration is used
*/
// Test4gray_2in9();
EPD_2IN9_V2_Init();
EPD_2IN9_V2_Clear();
ICNT_Init();
DEV_Delay_ms(100);
//Create a new image cache
UWORD Imagesize = ((EPD_2IN9_V2_WIDTH % 8 == 0)? (EPD_2IN9_V2_WIDTH / 8 ): (EPD_2IN9_V2_WIDTH / 8 + 1)) * EPD_2IN9_V2_HEIGHT;
if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL) {
printf("Failed to apply for black memory...\r\n");
return -1;
}
if((BlackImage_ASYNC = (UBYTE *)malloc(Imagesize)) == NULL) {
printf("Failed to apply for black memory...\r\n");
return -1;
}
printf("Paint_NewImage\r\n");
Paint_NewImage(BlackImage, EPD_2IN9_V2_WIDTH, EPD_2IN9_V2_HEIGHT, 90, WHITE);
Paint_SelectImage(BlackImage);
Paint_Clear(WHITE);
GUI_ReadBmp("./pic/2in9/Menu.bmp", 0, 0);
PAINT_TIME sPaint_time, sPaint_time_f;
Get_Current_Time(&sPaint_time);
Get_Current_Time(&sPaint_time_f);
Paint_DrawTime(210, 45, &sPaint_time, &Font24, WHITE, WHITE);
Paint_DrawDate(212, 80, &sPaint_time, &Font12, WHITE, WHITE);
EPD_2IN9_V2_Display_Base(BlackImage);
memcpy(BlackImage_ASYNC, BlackImage, Imagesize);
pthread_create(&t2, NULL, pthread_dis_2in9, NULL);
while(1) {
// k++;
if(i > 30 || ReFlag == 1) {
if(Page == 0) {
Get_Current_Time(&sPaint_time);
Paint_ClearWindows(210, 40, 290, 100, BLACK);
Paint_DrawTime(212, 45, &sPaint_time, &Font24, WHITE, WHITE);
Paint_DrawDate(212, 80, &sPaint_time, &Font12, WHITE, WHITE);
}
if(Page == 1 && SelfFlag != 1 && dis_lock != 1) {
memcpy(BlackImage_ASYNC, BlackImage, Imagesize);
dis_flag = 1;
i = 0;
k = 0;
j++;
ReFlag = 0;
printf("*** Draw Refresh ***\r\n");
}
else if(!dis_lock){
EPD_2IN9_V2_Display_Partial_Wait(BlackImage);
i = 0;
k = 0;
j++;
ReFlag = 0;
printf("*** Touch Refresh ***\r\n");
}
}else if(k++>50000000 && i>0 && Page == 1) {
EPD_2IN9_V2_Display_Partial(BlackImage);
i = 0;
k = 0;
j++;
printf("*** Overtime Refresh ***\r\n");
}else if(j > 100 || SelfFlag) {
SelfFlag = 0;
j = 0;
EPD_2IN9_V2_Init();
EPD_2IN9_V2_Display_Base(BlackImage);
printf("--- Self Refresh ---\r\n");
}
if(Page == 0 && ReFlag == 0) { //main menu
Get_Current_Time(&sPaint_time_f);
if(sPaint_time_f.Min != sPaint_time.Min) {
ReFlag = 1;
}
}
if(ICNT_Scan()==1 || (ICNT86_Dev_Now.X[0] == ICNT86_Dev_Old.X[0] && ICNT86_Dev_Now.Y[0] == ICNT86_Dev_Old.Y[0])) { // No new touch
// printf("%d %d \r\n", j, SelfFlag);
// printf("No new touch \r\n");
continue;
}
if(ICNT86_Dev_Now.TouchCount) {
i++;
if(Page == 0 && ReFlag == 0) { //main menu
if(ICNT86_Dev_Now.X[0] > 119 && ICNT86_Dev_Now.X[0] < 152 && ICNT86_Dev_Now.Y[0] > 31 && ICNT86_Dev_Now.Y[0] < 96) {
printf("Photo ...\r\n");
Page = 2;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
Show_Photo_Small_2in9(Photo_S);
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 39 && ICNT86_Dev_Now.X[0] < 80 && ICNT86_Dev_Now.Y[0] > 31 && ICNT86_Dev_Now.Y[0] < 96) {
printf("Draw ...\r\n");
Page = 1;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
ReFlag = 1;
}
}
if(Page == 1 && ReFlag == 0) { //white board
// Paint_DrawPoint(ICNT86_Dev_Now.X[0], ICNT86_Dev_Now.Y[0], BLACK, ICNT86_Dev_Now.P[0]/8+1, DOT_STYLE_DFT);
Paint_DrawPoint(ICNT86_Dev_Now.X[0], ICNT86_Dev_Now.Y[0], BLACK, 3, DOT_STYLE_DFT);
if(ICNT86_Dev_Now.X[0] > 136 && ICNT86_Dev_Now.X[0] < 159 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Home ...\r\n");
Page = 0;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 266 && ICNT86_Dev_Now.X[0] < 289 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Clear ...\r\n");
Page = 1;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 5 && ICNT86_Dev_Now.X[0] < 27 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Refresh ...\r\n");
SelfFlag = 1;
ReFlag = 1;
}
}
if(Page == 2 && ReFlag == 0) { //photo menu
if(ICNT86_Dev_Now.X[0] > 135 && ICNT86_Dev_Now.X[0] < 160 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Home ...\r\n");
Page = 0;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 203 && ICNT86_Dev_Now.X[0] < 224 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Next page ...\r\n");
Photo_S++;
if(Photo_S > 2) // 9 photos is a maximum of three pages
Photo_S=0;
ReFlag = 2;
}
else if(ICNT86_Dev_Now.X[0] > 71 && ICNT86_Dev_Now.X[0] < 92 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Last page ...\r\n");
if(Photo_S == 0)
printf("Top page ...\r\n");
else {
Photo_S--;
ReFlag = 2;
}
}
else if(ICNT86_Dev_Now.X[0] > 5 && ICNT86_Dev_Now.X[0] < 27 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Refresh ...\r\n");
SelfFlag = 1;
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 2 && ICNT86_Dev_Now.X[0] < 293 && ICNT86_Dev_Now.Y[0] > 2 && ICNT86_Dev_Now.Y[0] < 96 && ReFlag == 0) {
printf("Select photo ...\r\n");
Page = 3;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
Photo_L = ICNT86_Dev_Now.X[0]/96 + ICNT86_Dev_Now.Y[0]/48*3 + Photo_S*3 + 1;
Show_Photo_Large_2in9(Photo_L);
ReFlag = 1;
}
if(ReFlag == 2) { // Refresh small photo
ReFlag = 1;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
Show_Photo_Small_2in9(Photo_S); // show small photo
}
}
if(Page == 3 && ReFlag == 0) { //view the photo
if(ICNT86_Dev_Now.X[0] > 268 && ICNT86_Dev_Now.X[0] < 289 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Photo menu ...\r\n");
Page = 2;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
Show_Photo_Small_2in9(Photo_S);
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 203 && ICNT86_Dev_Now.X[0] < 224 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Next photo ...\r\n");
Photo_L++;
if(Photo_L > 9)
Photo_L=1;
ReFlag = 2;
}
else if(ICNT86_Dev_Now.X[0] > 135 && ICNT86_Dev_Now.X[0] < 160 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Home ...\r\n");
Page = 0;
GUI_ReadBmp(PagePath_2in9[Page], 0, 0);
ReFlag = 1;
}
else if(ICNT86_Dev_Now.X[0] > 71 && ICNT86_Dev_Now.X[0] < 92 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Last page ...\r\n");
if(Photo_L == 1)
printf("Top photo ...\r\n");
else {
Photo_L--;
ReFlag = 2;
}
}
else if(ICNT86_Dev_Now.X[0] > 5 && ICNT86_Dev_Now.X[0] < 27 && ICNT86_Dev_Now.Y[0] > 101 && ICNT86_Dev_Now.Y[0] < 124) {
printf("Refresh photo ...\r\n");
SelfFlag = 1;
ReFlag = 1;
}
if(ReFlag == 2) { // Refresh large photo
ReFlag = 1;
Show_Photo_Large_2in9(Photo_L);
}
}
}
}
return 0;
}