diff --git a/SoundslabDisplay.py b/SoundslabDisplay.py index 374d700..a181749 100644 --- a/SoundslabDisplay.py +++ b/SoundslabDisplay.py @@ -6,6 +6,7 @@ import struct import smbus import sys import musicpd +from math import floor class SoundslabDisplay: def __init__(self): @@ -28,11 +29,27 @@ class SoundslabDisplay: self.player_client = musicpd.MPDClient() self.player_client.connect() + def getBatteryState(self): + bus = smbus.SMBus(1) + + address = 0x36 + + read = bus.read_word_data(address, 2) + swapped = struct.unpack("H", read))[0] + voltage = swapped * 78.125 / 1000000 + + read = bus.read_word_data(address, 4) + swapped = struct.unpack("H", read))[0] + capacity = swapped / 256 + + return (voltage, capacity) + 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) + small_font = ImageFont.truetype(font='/usr/share/fonts/truetype/hack/Hack-Regular.ttf', size=12) overlay = ImageDraw.Draw(im_overlay) # draw four rects on edges of screen_size @@ -52,12 +69,26 @@ class SoundslabDisplay: 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) + (voltage, capacity) = self.getBatteryState() + battery_display = '{:02.2f}'.format(capacity) + '%' + (voltage2, capacity2) = self.getBatteryState() + battery_display_offset = 80 + if voltage2 > voltage: + # we're probably charging! + battery_display = 'Chrg ' + battery_display + battery_display_offset = 130 + overlay.text((self.screen_size[0] - battery_display_offset, 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) + overlay.rectangle([(70, self.screen_size[1] - 15), (self.screen_size[0] - 70, self.screen_size[1] - 5)], fill=(0, 0, 0, 0), outline=self.fg_color, width=1) + overlay.rectangle([(70, self.screen_size[1] - 15), (int((self.screen_size[0] - 140) * track_progress_percent) + 70, self.screen_size[1] - 5)], fill=self.fg_color, outline=self.fg_color, width=1) + + # add playhead position and song duration displays at beginning and end of progress meter + (time_width, time_height) = overlay.textsize(text='00:00', font=small_font) + playhead = str(floor(float(current_status['elapsed']) / 60)) + ":" + "{:02d}".format(floor(float(current_status['elapsed']) % 60)) + duration = str(floor(float(current_status['duration']) / 60)) + ":" + "{:02d}".format(floor(float(current_status['duration']) % 60)) + overlay.text((5, self.screen_size[1] - 20 + floor(time_height / 2)), playhead, font=small_font, fill=self.fg_color) + overlay.text((self.screen_size[0] - 5 - time_width, self.screen_size[1] - 20 + floor(time_height / 2)), duration, font=small_font, fill=self.fg_color) self.current_overlay = im_overlay.copy()