Touchscreen driver POC
Example documentation
This commit is contained in:
@@ -0,0 +1,268 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding:utf-8 -*-
|
||||
import sys
|
||||
import os
|
||||
picdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic/2in9')
|
||||
fontdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'pic')
|
||||
libdir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')
|
||||
if os.path.exists(libdir):
|
||||
sys.path.append(libdir)
|
||||
|
||||
from TP_lib import icnt86
|
||||
from TP_lib import epd2in9_V2
|
||||
from TP_lib import weather_2in9_V2
|
||||
|
||||
import time
|
||||
import logging
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
import traceback
|
||||
import threading
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
flag_t = 1
|
||||
|
||||
def pthread_irq() :
|
||||
print("pthread irq running")
|
||||
while flag_t == 1 :
|
||||
if(tp.digital_read(tp.INT) == 0) :
|
||||
ICNT_Dev.Touch = 1
|
||||
else :
|
||||
ICNT_Dev.Touch = 0
|
||||
time.sleep(0.01)
|
||||
print("thread irq: exit")
|
||||
|
||||
def Show_Photo_Small(image, small):
|
||||
for t in range(1, 7):
|
||||
if(small*3+t > 9):
|
||||
newimage = Image.open(os.path.join(picdir, PhotoPath_S[0]))
|
||||
image.paste(newimage, ((t-1)%3*98+2, (t-1)//3*48+2))
|
||||
else:
|
||||
newimage = Image.open(os.path.join(picdir, PhotoPath_S[small*3+t]))
|
||||
image.paste(newimage, ((t-1)%3*98+2, (t-1)//3*48+2))
|
||||
|
||||
def Show_Photo_Large(image, large):
|
||||
if(large > 9):
|
||||
newimage = Image.open(os.path.join(picdir, PhotoPath_L[0]))
|
||||
image.paste(newimage, (2, 2))
|
||||
else:
|
||||
newimage = Image.open(os.path.join(picdir, PhotoPath_L[large]))
|
||||
image.paste(newimage, (2, 2))
|
||||
|
||||
def Read_BMP(File, x, y):
|
||||
newimage = Image.open(os.path.join(picdir, File))
|
||||
image.paste(newimage, (x, y))
|
||||
|
||||
def Draw_Time(image, x, y, font1, font2):
|
||||
Time = time.strftime("%H : %M", time.localtime())
|
||||
Date = time.strftime("%Y - %m - %d", time.localtime())
|
||||
imagefill=255
|
||||
if image.mode!="1":
|
||||
imagefill = (255, 255, 255, 255)
|
||||
image.text((x, y), Time, font = font1, fill = imagefill)
|
||||
image.text((x-9, y+35), Date, font = font2, fill = imagefill)
|
||||
|
||||
|
||||
try:
|
||||
logging.info("epd2in9_V2 Touch Demo")
|
||||
|
||||
epd = epd2in9_V2.EPD_2IN9_V2()
|
||||
|
||||
|
||||
|
||||
tp = icnt86.INCT86()
|
||||
|
||||
ICNT_Dev = icnt86.ICNT_Development()
|
||||
ICNT_Old = icnt86.ICNT_Development()
|
||||
|
||||
'''
|
||||
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
|
||||
'''
|
||||
# epd.Init_4Gray()
|
||||
# Himage = Image.open(os.path.join(picdir, '2in9_Scale.bmp'))
|
||||
# epd.display_4Gray(epd.getbuffer_4Gray(Himage))
|
||||
# time.sleep(2)
|
||||
|
||||
logging.info("init and Clear")
|
||||
epd.init()
|
||||
tp.ICNT_Init()
|
||||
epd.Clear(0xFF)
|
||||
|
||||
t1 = threading.Thread(target = pthread_irq)
|
||||
t1.setDaemon(True)
|
||||
t1.start()
|
||||
|
||||
# Drawing on the image
|
||||
font15 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 15)
|
||||
font24 = ImageFont.truetype(os.path.join(fontdir, 'Font.ttc'), 24)
|
||||
|
||||
image = Image.open(os.path.join(picdir, 'Menu.bmp'))
|
||||
DrawImage = ImageDraw.Draw(image)
|
||||
|
||||
Draw_Time(DrawImage, 209, 40, font24, font15)
|
||||
|
||||
epd.display_Base(epd.getbuffer(image))
|
||||
|
||||
i = j = k = ReFlag = SelfFlag = Page = Photo_L = Photo_S = 0
|
||||
PhotoPath_S = [ "Photo_1_0.bmp",
|
||||
"Photo_1_1.bmp", "Photo_1_2.bmp", "Photo_1_3.bmp", "Photo_1_4.bmp",
|
||||
"Photo_1_5.bmp", "Photo_1_6.bmp", "Photo_1_7.bmp", "Photo_1_8.bmp",
|
||||
"Photo_1_9.bmp",
|
||||
]
|
||||
PhotoPath_L = [ "Photo_2_0.bmp",
|
||||
"Photo_2_1.bmp", "Photo_2_2.bmp", "Photo_2_3.bmp", "Photo_2_4.bmp",
|
||||
"Photo_2_5.bmp", "Photo_2_6.bmp", "Photo_2_7.bmp", "Photo_2_8.bmp",
|
||||
"Photo_2_9.bmp",
|
||||
]
|
||||
PagePath = ["Menu.bmp", "screen_output.png", "Photo_1.bmp", "Photo_2.bmp"]
|
||||
|
||||
while(1):
|
||||
if(i > 20 or ReFlag == 1):
|
||||
if(Page == 0):
|
||||
DrawImage.rectangle((209, 40, 290, 120), fill = 0)
|
||||
Draw_Time(DrawImage, 209, 40, font24, font15)
|
||||
# print("*** Time Refresh ***\r\n")
|
||||
|
||||
if(Page == 1):
|
||||
weather_2in9_V2.get_weather_png()
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
|
||||
epd.display_Partial_Wait(epd.getbuffer(image))
|
||||
print("*** Touch Refresh ***\r\n")
|
||||
i = 0
|
||||
k = 0
|
||||
j += 1
|
||||
ReFlag = 0
|
||||
elif(k>50000 and i>0 and Page == 1):
|
||||
epd.display_Partial_Wait(epd.getbuffer(image))
|
||||
i = 0
|
||||
k = 0
|
||||
j += 1
|
||||
print("*** Overtime Refresh ***\r\n")
|
||||
elif(j > 50 or SelfFlag):
|
||||
SelfFlag = 0
|
||||
j = 0
|
||||
epd.init()
|
||||
epd.display_Base(epd.getbuffer(image))
|
||||
print("--- Self Refresh ---\r\n")
|
||||
else:
|
||||
k += 1
|
||||
|
||||
if(Page==0 and k>5000000):
|
||||
ReFlag = 1
|
||||
|
||||
tp.ICNT_Scan(ICNT_Dev, ICNT_Old)
|
||||
if(ICNT_Old.X[0] == ICNT_Dev.X[0] and ICNT_Old.Y[0] == ICNT_Dev.Y[0]):
|
||||
continue
|
||||
|
||||
if(ICNT_Dev.TouchCount):
|
||||
ICNT_Dev.TouchCount = 0
|
||||
i += 1
|
||||
if(Page == 0 and ReFlag == 0): #main menu
|
||||
if(ICNT_Dev.X[0] > 119 and ICNT_Dev.X[0] < 152 and ICNT_Dev.Y[0] > 31 and ICNT_Dev.Y[0] < 96):
|
||||
print("Photo ...\r\n")
|
||||
Page = 2
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
Show_Photo_Small(image, Photo_S)
|
||||
ReFlag = 1
|
||||
elif(ICNT_Dev.X[0] > 39 and ICNT_Dev.X[0] < 80 and ICNT_Dev.Y[0] > 31 and ICNT_Dev.Y[0] < 96):
|
||||
print("Weather ...\r\n")
|
||||
Page = 1
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
ReFlag = 1
|
||||
|
||||
|
||||
if(Page == 1 and ReFlag == 0): #weather
|
||||
if(ICNT_Dev.X[0] > 136 and ICNT_Dev.X[0] < 159 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Home ...\r\n")
|
||||
Page = 0
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
ReFlag = 1
|
||||
elif(ICNT_Dev.X[0] > 5 and ICNT_Dev.X[0] < 27 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Refresh ...\r\n")
|
||||
SelfFlag = 1
|
||||
ReFlag = 1
|
||||
|
||||
|
||||
if(Page == 2 and ReFlag == 0): #photo menu
|
||||
if(ICNT_Dev.X[0] > 135 and ICNT_Dev.X[0] < 160 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Home ...\r\n")
|
||||
Page = 0
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
ReFlag = 1
|
||||
elif(ICNT_Dev.X[0] > 203 and ICNT_Dev.X[0] < 224 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Next page ...\r\n")
|
||||
Photo_S += 1
|
||||
if(Photo_S > 2): # 9 photos is a maximum of three pages
|
||||
Photo_S=0
|
||||
ReFlag = 2
|
||||
elif(ICNT_Dev.X[0] > 71 and ICNT_Dev.X[0] < 92 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Last page ...\r\n")
|
||||
if(Photo_S == 0):
|
||||
print("Top page ...\r\n")
|
||||
else:
|
||||
Photo_S -= 1
|
||||
ReFlag = 2
|
||||
elif(ICNT_Dev.X[0] > 5 and ICNT_Dev.X[0] < 27 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Refresh ...\r\n")
|
||||
SelfFlag = 1
|
||||
ReFlag = 1
|
||||
elif(ICNT_Dev.X[0] > 2 and ICNT_Dev.X[0] < 293 and ICNT_Dev.Y[0] > 2 and ICNT_Dev.Y[0] < 96 and ReFlag == 0):
|
||||
print("Select photo ...\r\n")
|
||||
Page = 3
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
Photo_L = ICNT_Dev.X[0]//96 + ICNT_Dev.Y[0]//48*3 + Photo_S*3 + 1
|
||||
Show_Photo_Large(image, Photo_L)
|
||||
ReFlag = 1
|
||||
if(ReFlag == 2): # Refresh small photo
|
||||
ReFlag = 1
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
Show_Photo_Small(image, Photo_S) # show small photo
|
||||
|
||||
|
||||
if(Page == 3 and ReFlag == 0): #view the photo
|
||||
if(ICNT_Dev.X[0] > 268 and ICNT_Dev.X[0] < 289 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Photo menu ...\r\n")
|
||||
Page = 2
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
Show_Photo_Small(image, Photo_S)
|
||||
ReFlag = 1
|
||||
elif(ICNT_Dev.X[0] > 203 and ICNT_Dev.X[0] < 224 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Next photo ...\r\n")
|
||||
Photo_L += 1
|
||||
if(Photo_L > 9):
|
||||
Photo_L = 1
|
||||
ReFlag = 2
|
||||
elif(ICNT_Dev.X[0] > 135 and ICNT_Dev.X[0] < 160 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Home ...\r\n")
|
||||
Page = 0
|
||||
Read_BMP(PagePath[Page], 0, 0)
|
||||
ReFlag = 1
|
||||
elif(ICNT_Dev.X[0] > 71 and ICNT_Dev.X[0] < 92 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Last page ...\r\n")
|
||||
if(Photo_L == 1):
|
||||
print("Top photo ...\r\n")
|
||||
else:
|
||||
Photo_L -= 1
|
||||
ReFlag = 2
|
||||
elif(ICNT_Dev.X[0] > 5 and ICNT_Dev.X[0] < 27 and ICNT_Dev.Y[0] > 101 and ICNT_Dev.Y[0] < 124):
|
||||
print("Refresh photo ...\r\n")
|
||||
SelfFlag = 1
|
||||
ReFlag = 1
|
||||
if(ReFlag == 2): # Refresh large photo
|
||||
ReFlag = 1
|
||||
Show_Photo_Large(image, Photo_L)
|
||||
|
||||
|
||||
except IOError as e:
|
||||
logging.info(e)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logging.info("ctrl + c:")
|
||||
flag_t = 0
|
||||
epd.sleep()
|
||||
time.sleep(2)
|
||||
t1.join()
|
||||
epd.Dev_exit()
|
||||
exit()
|
||||
Reference in New Issue
Block a user