102 lines
4.4 KiB
Python
102 lines
4.4 KiB
Python
#!/usr/bin python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
This project is designed for the WaveShare 12.48" eInk display. Modifications will be needed for other displays,
|
|
especially the display drivers and how the image is being rendered on the display. Also, this is the first project that
|
|
I posted on GitHub so please go easy on me. There are still many parts of the code (especially with timezone
|
|
conversions) that are not tested comprehensively, since my calendar/events are largely based on the timezone I'm in.
|
|
There will also be work needed to adjust the calendar rendering for different screen sizes, such as modifying of the
|
|
CSS stylesheets in the "render" folder.
|
|
"""
|
|
import datetime as dt
|
|
import os
|
|
import sys
|
|
|
|
|
|
import json
|
|
import logging
|
|
from PIL import Image,ImageDraw,ImageFont
|
|
|
|
|
|
def main():
|
|
# Basic configuration settings (user replaceable)
|
|
# config.json is in the root folder
|
|
configFile = open(os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'config.json'))
|
|
config = json.load(configFile)
|
|
|
|
|
|
isDisplayConected = config['isDisplayConected'] # set to true when debugging rendering without displaying to screen
|
|
screenWidth = config['screenWidth'] # Width of E-Ink display. Default is landscape. Need to rotate image to fit.
|
|
screenHeight = config['screenHeight'] # Height of E-Ink display. Default is landscape. Need to rotate image to fit.
|
|
imageWidth = config['imageWidth'] # Width of image to be generated for display.
|
|
imageHeight = config['imageHeight'] # Height of image to be generated for display.
|
|
rotateAngle = config['rotateAngle'] # If image is rendered in portrait orientation, angle to rotate to fit screen
|
|
hourFormat = config['hourFormat'] # The format the hour will be displayed. eg. 13:02 or 01:02 PM
|
|
|
|
# Set the hour, this is important to see what time the e-Paper has been syncronized
|
|
if hourFormat == "12h":
|
|
time = dt.datetime.now().strftime("%I:%M %p")
|
|
else:
|
|
time = dt.datetime.now().strftime("%H:%M")
|
|
|
|
|
|
assets = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'assets')
|
|
fontsdir = os.path.join(assets, 'fonts')
|
|
# Drawing on the image
|
|
font15 = ImageFont.truetype(os.path.join(fontsdir, 'wavesharefont.ttc'), 15)
|
|
font24 = ImageFont.truetype(os.path.join(fontsdir, 'wavesharefont.ttc'), 24)
|
|
|
|
# pixel_operator fonts
|
|
font8 = ImageFont.truetype(os.path.join(os.path.join(fontsdir, 'pixel_operator'), 'PixelOperator8.ttf'), 8)
|
|
font8_bold = ImageFont.truetype(os.path.join(os.path.join(fontsdir, 'pixel_operator'), 'PixelOperator8-Bold.ttf'), 8)
|
|
font16 = ImageFont.truetype(os.path.join(os.path.join(fontsdir, 'pixel_operator'), 'PixelOperator.ttf'), 16)
|
|
font16_bold = ImageFont.truetype(os.path.join(os.path.join(fontsdir, 'pixel_operator'), 'PixelOperator-Bold.ttf'), 16)
|
|
|
|
font16_2 = ImageFont.truetype(os.path.join(fontsdir, 'Better VCR 9.0.1.ttf'), 16)
|
|
font8_2 = ImageFont.truetype(os.path.join(fontsdir, 'Better VCR 9.0.1.ttf'), 12)
|
|
|
|
|
|
|
|
image = Image.new('1', (imageWidth, imageHeight), 255) # 255: clear the frame
|
|
draw = ImageDraw.Draw(image)
|
|
|
|
fonts8 = [font8, font8_bold, font8_2]
|
|
fonts16 = [font16, font16_bold, font16_2]
|
|
y = 0
|
|
for font in fonts8:
|
|
draw.text((0, y), f"Lore Ipso sum {time}", font = font, fill = 0) # draw the current time in the top left corner
|
|
y += 12
|
|
if y >= screenHeight:
|
|
break
|
|
|
|
for font in fonts16:
|
|
draw.text((0, y), f"Lore Ipso sum {time}", font = font, fill = 0) # draw the current time in the top left corner
|
|
y += 16
|
|
if y >= screenHeight:
|
|
break
|
|
|
|
|
|
# draw.line([(0,50),(50,0)], fill = 0,width = 1)
|
|
# draw.chord((10, 60, 50, 100), 0, 360, fill = 0)
|
|
# draw.ellipse((55, 60, 95, 100), outline = 0)
|
|
# draw.pieslice((55, 60, 95, 100), 90, 180, outline = 0)
|
|
# draw.pieslice((55, 60, 95, 100), 270, 360, fill = 0)
|
|
# draw.polygon([(110,0),(110,50),(150,25)],outline = 0)
|
|
# draw.polygon([(190,0),(190,50),(150,25)],fill = 0)
|
|
# draw.rectangle([(0,0),(50,50)],outline = 0)
|
|
|
|
image.save(os.path.join(assets, 'test-fonts.bmp'))
|
|
|
|
|
|
|
|
if isDisplayConected:
|
|
from display.display import DisplayHelper
|
|
|
|
displayService = DisplayHelper(screenWidth, screenHeight)
|
|
displayService.update(image.rotate(rotateAngle)) # go to sleep
|
|
displayService.clear()
|
|
displayService.sleep() # go to sleep
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|