100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
from datetime import datetime, timedelta, timezone
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
|
import cache
|
|
import ptv
|
|
|
|
# Data
|
|
now = datetime.now(timezone.utc)
|
|
with cache.open() as c:
|
|
ptv_data = {
|
|
k: (v - now) // timedelta(minutes=1) if v else '-'
|
|
for k, v in ptv.get_departure_data(now, c).items()
|
|
}
|
|
|
|
BLACK = 0x000000 # 00 BGR
|
|
WHITE = 0xffffff # 01
|
|
YELLOW = 0x00ffff # 10
|
|
RED = 0x0000ff # 11
|
|
fontstd = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 64)
|
|
fontmins = ImageFont.truetype('assets/NETWORKSANS-2019-BOLD.TTF', 96)
|
|
fonttime = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 92)
|
|
fontmm = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 20)
|
|
fonthigh = ImageFont.truetype('assets/NETWORKSANS-2019-REGULAR.TTF', 42)
|
|
|
|
image = Image.new('RGB', (800, 480), WHITE)
|
|
draw = ImageDraw.Draw(image)
|
|
|
|
# Backing image
|
|
with Image.open('assets/ui test 3.png').convert('RGBA') as bg:
|
|
image.paste(bg, (0, 0))
|
|
|
|
# Time
|
|
timehour = f'{now:%H}'
|
|
timemin = f'{now:%M}'
|
|
timehourlength = draw.textlength(timehour, font=fonttime)-3
|
|
timeminstart = timehourlength + draw.textlength(':', font=fonttime)-3
|
|
draw.text((-3, 480-3), timehour, font=fonttime, anchor="ls", fill=WHITE)
|
|
draw.text((timehourlength, 480-12), f':', font=fonttime, anchor="ls", fill=WHITE)
|
|
draw.text((timeminstart, 480-3), timemin, font=fonttime, anchor="ls", fill=WHITE)
|
|
|
|
# Date
|
|
dateday = f'{now:%d}'
|
|
datedaylength = draw.textlength(dateday, font=fontstd)
|
|
draw.text((-3, 320), dateday, font=fontstd, anchor="ls", fill=WHITE)
|
|
draw.text((datedaylength + 5, 320), f'{now:%b}', font=fontstd, anchor="lt", fill=WHITE)
|
|
|
|
# Temperature
|
|
temp = 6
|
|
temphigh = 6
|
|
draw.text((-3, 200), f'{temp}°', font=fontstd, anchor="ls", fill=WHITE)
|
|
draw.text((124, 238), f'{temphigh}', font=fonthigh, anchor="ms", fill=WHITE)
|
|
|
|
# Rainfall
|
|
rainfall = 6
|
|
rainthreshold = 5
|
|
if rainfall > rainthreshold:
|
|
rainimgpath = 'assets/rain.png'
|
|
else:
|
|
rainimgpath = 'assets/sun.png'
|
|
draw.text((40, 0), f'{rainfall}', font=fontstd, anchor="mt")
|
|
with Image.open(rainimgpath) as rainimg:
|
|
image.paste(rainimg, mask=rainimg)
|
|
draw.text((40, 55), f'mm', font=fontmm, anchor="mt")
|
|
|
|
# ETAs
|
|
leftminsx = 375
|
|
centerminsx = 545
|
|
rightminsx = 715
|
|
busminsy = 75
|
|
trainminsy = 235
|
|
tramminsy = 395
|
|
draw.text((leftminsx, busminsy), f'{ptv_data["612 S"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((centerminsx, busminsy), f'{ptv_data["612 N"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((rightminsx, busminsy), f'{ptv_data["766 N"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((leftminsx, trainminsy), f'{ptv_data["Union W Express"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((centerminsx, trainminsy), f'{ptv_data["Union W"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((rightminsx, trainminsy), f'{ptv_data["Union E"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((centerminsx, tramminsy), f'{ptv_data["109 W"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
draw.text((rightminsx, tramminsy), f'{ptv_data["70 W"]}', font=fontmins, anchor="mt", fill=BLACK)
|
|
|
|
image.save('test_before_palette.png')
|
|
|
|
# Dither into eink palette
|
|
pal_image = Image.new('P', (1, 1))
|
|
pal_image.putpalette((0x00,0x00,0x00, 0xff,0xff,0xff, 0xff,0xff,0x00, 0xff,0x00,0x00) + (0x00,0x00,0x00)*252)
|
|
# Convert the source image to the 4 colors, dithering if needed
|
|
image_4color = image.quantize(palette=pal_image, dither=Image.NONE)
|
|
image_4color.save('test_after_palette.png')
|
|
|
|
show_on_screen = False
|
|
if show_on_screen:
|
|
import epd7in3g as epd
|
|
try:
|
|
epd.init()
|
|
epd.display(epd.get_buffer(image))
|
|
input('Press Enter to clear')
|
|
finally:
|
|
epd.clear()
|
|
epd.epdconfig.module_exit(cleanup=True)
|