diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..00f2d38 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +*.pyc +.venv/ diff --git a/epd2in13_V2.py b/lib/epd2in13_V2.py similarity index 99% rename from epd2in13_V2.py rename to lib/epd2in13_V2.py index cce28ff..7d17603 100644 --- a/epd2in13_V2.py +++ b/lib/epd2in13_V2.py @@ -29,7 +29,7 @@ import logging -import epdconfig +from . import epdconfig # Display resolution EPD_WIDTH = 122 diff --git a/epdconfig.py b/lib/epdconfig.py similarity index 52% rename from epdconfig.py rename to lib/epdconfig.py index d1f5120..db6ff32 100644 --- a/epdconfig.py +++ b/lib/epdconfig.py @@ -126,144 +126,6 @@ class RaspberryPi: - - -class JetsonNano: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - PWR_PIN = 18 - - def __init__(self): - import ctypes - find_dirs = [ - os.path.dirname(os.path.realpath(__file__)), - '/usr/local/lib', - '/usr/lib', - ] - self.SPI = None - for find_dir in find_dirs: - so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') - if os.path.exists(so_filename): - self.SPI = ctypes.cdll.LoadLibrary(so_filename) - break - if self.SPI is None: - raise RuntimeError('Cannot find sysfs_software_spi.so') - - import Jetson.GPIO - self.GPIO = Jetson.GPIO - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(self.BUSY_PIN) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.SYSFS_software_spi_transfer(data[0]) - - def spi_writebyte2(self, data): - for i in range(len(data)): - self.SPI.SYSFS_software_spi_transfer(data[i]) - - def module_init(self): - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.PWR_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - self.GPIO.output(self.PWR_PIN, 1) - - self.SPI.SYSFS_software_spi_begin() - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.SYSFS_software_spi_end() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - self.GPIO.output(self.PWR_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN, self.PWR_PIN]) - - -class SunriseX3: - # Pin definition - RST_PIN = 17 - DC_PIN = 25 - CS_PIN = 8 - BUSY_PIN = 24 - PWR_PIN = 18 - Flag = 0 - - def __init__(self): - import spidev - import Hobot.GPIO - - self.GPIO = Hobot.GPIO - self.SPI = spidev.SpiDev() - - def digital_write(self, pin, value): - self.GPIO.output(pin, value) - - def digital_read(self, pin): - return self.GPIO.input(pin) - - def delay_ms(self, delaytime): - time.sleep(delaytime / 1000.0) - - def spi_writebyte(self, data): - self.SPI.writebytes(data) - - def spi_writebyte2(self, data): - # for i in range(len(data)): - # self.SPI.writebytes([data[i]]) - self.SPI.xfer3(data) - - def module_init(self): - if self.Flag == 0: - self.Flag = 1 - self.GPIO.setmode(self.GPIO.BCM) - self.GPIO.setwarnings(False) - self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) - self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) - self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) - self.GPIO.setup(self.PWR_PIN, self.GPIO.OUT) - self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) - - self.GPIO.output(self.PWR_PIN, 1) - - # SPI device, bus = 0, device = 0 - self.SPI.open(2, 0) - self.SPI.max_speed_hz = 4000000 - self.SPI.mode = 0b00 - return 0 - else: - return 0 - - def module_exit(self): - logger.debug("spi end") - self.SPI.close() - - logger.debug("close 5V, Module enters 0 power consumption ...") - self.Flag = 0 - self.GPIO.output(self.RST_PIN, 0) - self.GPIO.output(self.DC_PIN, 0) - self.GPIO.output(self.PWR_PIN, 0) - - self.GPIO.cleanup([self.RST_PIN, self.DC_PIN, self.CS_PIN, self.BUSY_PIN], self.PWR_PIN) - - if sys.version_info[0] == 2: process = subprocess.Popen("cat /proc/cpuinfo | grep Raspberry", shell=True, stdout=subprocess.PIPE) else: @@ -272,14 +134,7 @@ output, _ = process.communicate() if sys.version_info[0] == 2: output = output.decode(sys.stdout.encoding) -if "Raspberry" in output: - implementation = RaspberryPi() -elif os.path.exists('/sys/bus/platform/drivers/gpio-x3'): - implementation = SunriseX3() -else: - implementation = JetsonNano() +implementation = RaspberryPi() for func in [x for x in dir(implementation) if not x.startswith('_')]: setattr(sys.modules[__name__], func, getattr(implementation, func)) - -### END OF FILE ### diff --git a/Font.ttc b/res/Font.ttc similarity index 100% rename from Font.ttc rename to res/Font.ttc diff --git a/sheo1.bmp b/res/sheo1.bmp similarity index 100% rename from sheo1.bmp rename to res/sheo1.bmp diff --git a/sheogorath.py b/sheogorath.py index 184e9c8..feec9a0 100644 --- a/sheogorath.py +++ b/sheogorath.py @@ -4,26 +4,53 @@ import sys import os import logging -import epd2in13_V2 import time -from PIL import Image,ImageDraw,ImageFont +from PIL import Image,ImageDraw,ImageFont,ImageShow import traceback +import argparse + +parser = argparse.ArgumentParser(description='e-Ink Sheogorath') +parser.add_argument('--debug', action='store_true', help='If true, does not initialize e-Ink, shows images in window') +args = parser.parse_args() logging.basicConfig(level=logging.DEBUG) +class EPDummy: + def __init__(self): + self.width = 122 + self.height = 250 + FULL_UPDATE = 0 + PART_UPDATE = 1 +epd = EPDummy() + +if not args.debug: + from lib import epd2in13_V2 + epd = epd2in13_V2.EPD() + +def display(image): + if args.debug: + ImageShow.show(image) + else: + epd.display(epd.getbuffer(image)) + +def setMode(mode): + if not args.debug: + epd.init(mode) + try: logging.info("epd2in13_V2 Demo") - - epd = epd2in13_V2.EPD() - logging.info("init and Clear") - epd.init(epd.FULL_UPDATE) - epd.Clear(0xFF) + + #epd = epd2in13_V2.EPD() + #epd = None + if not args.debug: + logging.info("init and Clear") + epd.init(epd.FULL_UPDATE) + epd.Clear(0xFF) # Drawing on the image - font15 = ImageFont.truetype('Font.ttc', 15) - font24 = ImageFont.truetype('Font.ttc', 24) + font15 = ImageFont.truetype('res/Font.ttc', 15) + font24 = ImageFont.truetype('res/Font.ttc', 24) - logging.info("1.Drawing on the image...") image = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame draw = ImageDraw.Draw(image) @@ -39,16 +66,19 @@ try: draw.polygon([(190,0),(190,50),(150,25)],fill = 0) draw.text((120, 60), 'e-Paper demo', font = font15, fill = 0) draw.text((110, 90), u'', font = font24, fill = 0) - epd.display(epd.getbuffer(image)) + #epd.display(epd.getbuffer(image)) + display(image) + time.sleep(2) # read bmp file on window logging.info("3.read bmp file on window...") # epd.Clear(0xFF) image1 = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame - bmp = Image.open('sheo1.bmp') + bmp = Image.open('res/sheo1.bmp') image1.paste(bmp, (2,2)) - epd.display(epd.getbuffer(image1)) + #epd.display(epd.getbuffer(image1)) + display(image1) time.sleep(2) # # partial update @@ -56,22 +86,25 @@ try: time_image = Image.new('1', (epd.height, epd.width), 255) time_draw = ImageDraw.Draw(time_image) - epd.init(epd.FULL_UPDATE) + #epd.init(epd.FULL_UPDATE) + setMode(epd.FULL_UPDATE) time_image.paste(bmp, (2,2)) - epd.displayPartBaseImage(epd.getbuffer(time_image)) + #epd.displayPartBaseImage(epd.getbuffer(time_image)) + display(time_image) - epd.init(epd.PART_UPDATE) + #epd.init(epd.PART_UPDATE) + setMode(epd.PART_UPDATE) num = 0 while (True): time_draw.rectangle((140, 90, 250, 122), fill = 255) time_draw.text((140, 90), time.strftime('%H:%M:%S'), font = font24, fill = 0) - epd.displayPartial(epd.getbuffer(time_image)) - num = num + 1 - #if(num == 10): - #break + #epd.displayPartial(epd.getbuffer(time_image)) + display(time_image) + time.sleep(0.9) # epd.Clear(0xFF) logging.info("Clear...") - epd.init(epd.FULL_UPDATE) + #epd.init(epd.FULL_UPDATE) + setMode(epd.FULL_UPDATE) epd.Clear(0xFF) logging.info("Goto Sleep...")