#!/usr/bin/python # -*- coding:utf-8 -*- import argparse import contextlib import itertools import logging import os import random import sys import time from PIL import Image,ImageDraw,ImageFont parser = argparse.ArgumentParser() parser.add_argument("imgdir", help="location of dithered bmps to rotate") parser.add_argument("--debug", action="store_true") parser.add_argument("--delay", default=600, type=int) parser.add_argument("--simulate", action="store_true") parser.add_argument("--clear", action="store_true", help="clear panel first run") args = parser.parse_args() if args.simulate: import mock_epd as epd7in3f else: from waveshare_epd import epd7in3f log_format = "%(asctime)s %(levelname)s %(name)s: %(message)s" if args.debug is True: logging.basicConfig(level=logging.DEBUG, format=log_format) else: logging.basicConfig(level=logging.INFO, format=log_format) logger = logging.getLogger(__name__) paths = [os.path.join(args.imgdir, f) for f in os.listdir(args.imgdir) if f.endswith(".bmp") and os.path.isfile(os.path.join(args.imgdir, f))] random.shuffle(paths) if args.simulate is True: delay = args.delay else: delay = max(args.delay, 180) logger.info("hello!") logger.info(f"rotating images in {args.imgdir} every {delay}s") @contextlib.contextmanager def EPD(): epd = epd7in3f.EPD() try: epd.init() yield epd finally: epd.sleep() try: iteration = 1 for filename in itertools.cycle(paths): with EPD() as epd: if iteration == 1 and args.clear: epd.Clear() logger.info(f"displaying {filename}") Himage = Image.open(filename) epd.display(epd.getbuffer(Himage)) logger.info(f"sleeping for {delay}s...") time.sleep(delay) iteration += 1 except IOError as e: logger.info(e) except KeyboardInterrupt: logger.info("ctrl + c") logger.info("clearing the screen") with EPD() as epd: epd.Clear() finally: logger.info("cleaning up") epd7in3f.epdconfig.module_exit(cleanup=True) logger.info("bye!")