soundslab/SoundslabDisplay.py

78 lines
3.7 KiB
Python
Raw Normal View History

import time
from PIL import Image, ImageFont, ImageDraw
from ST7789 import ST7789
from glob import glob
import struct
import smbus
import sys
import musicpd
class SoundslabDisplay:
def __init__(self):
self.screen_size = 240, 240
self.spi_speed_mhz = 80
self.st7789 = ST7789(
rotation=90,
port=0,
cs=1,
dc=9,
backlight=13,
spi_speed_hz=self.spi_speed_mhz * 1000 * 1000
)
self.current_background = Image.new("RGBA", self.screen_size, (0, 0, 255, 255))
self.current_overlay = Image.new("RGBA", self.screen_size, (0, 0, 0, 0))
self.current_menu = Image.new("RGBA", self.screen_size, (0, 0, 0, 0))
self.fg_color = (255, 255, 255, 211)
self.bg_color = (0, 0, 0, 78)
# set up connection to mpd here - TODO: this belongs elsewhere and should be passed or pulled in
self.player_client = musicpd.MPDClient()
self.player_client.connect()
def updateOverlay(self, battery_level_percent):
# initialize overlay
im_overlay = Image.new("RGBA", self.screen_size, (0, 0, 0, 0))
font = ImageFont.truetype(font='/usr/share/fonts/truetype/hack/Hack-Bold.ttf', size=18)
overlay = ImageDraw.Draw(im_overlay)
# draw four rects on edges of screen_size
overlay.rectangle([(0, 0), (self.screen_size[0], 20)], self.bg_color) # top bar
overlay.rectangle([(0, self.screen_size[1] - 20), (self.screen_size[0], self.screen_size[1])], self.bg_color) # bottom bar
overlay.rectangle([(0, 20), (20, self.screen_size[1] - 20)], self.bg_color) # left bar
overlay.rectangle([(self.screen_size[0] - 20, 20), (self.screen_size[0], self.screen_size[1] - 20)], self.bg_color) # right bar
# get status from mpd
current_status = self.player_client.status()
current_track_number = int(current_status['song']) + 1
total_track_number = current_status['playlistlength']
track_progress_percent = float(current_status['elapsed']) / float(current_status['duration'])
print("track progress:" + str(track_progress_percent))
# add track # / total #
track_and_queue = str(current_track_number) + " of " + str(total_track_number)
overlay.text((10, 0), track_and_queue, font=font, fill=self.fg_color)
# add battery level
battery_display = '{:02.2f}'.format(battery_level_percent) + '%'
overlay.text((self.screen_size[0] - 70, 0), battery_display, font=font, fill=self.fg_color)
# add progress meter
overlay.rectangle([(10, self.screen_size[1] - 15), (self.screen_size[0] - 10, self.screen_size[1] - 5)], fill=(0, 0, 0, 0), outline=self.fg_color, width=1)
overlay.rectangle([(10, self.screen_size[1] - 15), (int((self.screen_size[0] - 20) * track_progress_percent) + 10, self.screen_size[1] - 5)], fill=self.fg_color, outline=self.fg_color, width=1)
self.current_overlay = im_overlay.copy()
def updateAlbumArt(self):
current_status = self.player_client.status()
song_data = self.player_client.playlistid(current_status['songid'])
print(song_data[0]['file'])
path_info = song_data[0]['file'].split('/')
print(path_info)
cover_image_file = '/media/usb0/' + path_info[0] + '/' + path_info[1] + '/cover.jpg'
im = Image.open(cover_image_file).convert("RGBA")
image = im.resize(self.screen_size)
self.current_background = image.copy()
def updateDisplay(self):
tempoutput = Image.alpha_composite(self.current_background, self.current_overlay)
self.st7789.display(Image.alpha_composite(tempoutput, self.current_menu))