Delete E-Paper.py
This commit is contained in:
		| @@ -1,527 +0,0 @@ | |||||||
| #!/usr/bin/python3 |  | ||||||
| # -*- coding: utf-8 -*- |  | ||||||
| """ |  | ||||||
| E-Paper Software (main script) for the 3-colour and 2-Colour E-Paper display |  | ||||||
| A full and detailed breakdown for this code can be found in the wiki. |  | ||||||
| If you have any questions, feel free to open an issue at Github. |  | ||||||
|  |  | ||||||
| Copyright by aceisace |  | ||||||
| """ |  | ||||||
| from __future__ import print_function |  | ||||||
| import calendar |  | ||||||
| from datetime import datetime, date, timedelta |  | ||||||
| from time import sleep |  | ||||||
| from dateutil.rrule import * |  | ||||||
| from dateutil.parser import parse |  | ||||||
| import arrow |  | ||||||
| import re |  | ||||||
| import random |  | ||||||
| import gc |  | ||||||
| import feedparser |  | ||||||
| import numpy as np |  | ||||||
| from pytz import timezone |  | ||||||
|  |  | ||||||
| from settings import * |  | ||||||
| from image_data import * |  | ||||||
|  |  | ||||||
| from PIL import Image, ImageDraw, ImageFont, ImageOps |  | ||||||
| import pyowm |  | ||||||
| from ics import Calendar |  | ||||||
| try: |  | ||||||
|     from urllib.request import urlopen |  | ||||||
| except Exception as e: |  | ||||||
|     print("Something didn't work right, maybe you're offline?"+e.reason) |  | ||||||
|  |  | ||||||
| import e_paper_drivers |  | ||||||
| epd = e_paper_drivers.EPD() |  | ||||||
|  |  | ||||||
| from calibration import calibration |  | ||||||
|  |  | ||||||
| EPD_WIDTH = 640 |  | ||||||
| EPD_HEIGHT = 384 |  | ||||||
|  |  | ||||||
| if language in ['ja','zh','zh_tw','ko']: |  | ||||||
|     default = ImageFont.truetype(fpath+NotoSansCJK+'Light.otf', 18) |  | ||||||
|     semi = ImageFont.truetype(fpath+NotoSansCJK+'DemiLight.otf', 18) |  | ||||||
|     bold = ImageFont.truetype(fpath+NotoSansCJK+'Regular.otf', 18) |  | ||||||
|     month_font = ImageFont.truetype(fpath+NotoSansCJK+'DemiLight.otf', 40) |  | ||||||
| else: |  | ||||||
|     default = ImageFont.truetype(fpath+NotoSans+'Light.ttf', 18) |  | ||||||
|     semi = ImageFont.truetype(fpath+NotoSans+'.ttf', 18) |  | ||||||
|     bold = ImageFont.truetype(fpath+NotoSans+'Medium.ttf', 18) |  | ||||||
|     month_font = ImageFont.truetype(fpath+NotoSans+'Light.ttf', 40) |  | ||||||
|  |  | ||||||
| w_font_l = ImageFont.truetype(fpath+weather_font, 60) |  | ||||||
| w_font_s = ImageFont.truetype(fpath+weather_font, 22) |  | ||||||
|  |  | ||||||
| im_open = Image.open |  | ||||||
|  |  | ||||||
| '''Get system timezone and set timezone accordingly''' |  | ||||||
| with open('/etc/timezone','r') as file: |  | ||||||
|     lines = file.readlines() |  | ||||||
|     system_tz = lines[0].rstrip() |  | ||||||
|     local_tz = timezone(system_tz) |  | ||||||
|  |  | ||||||
| print('Initialising weather') |  | ||||||
| owm = pyowm.OWM(api_key, language=language) |  | ||||||
|  |  | ||||||
| """Main loop starts from here""" |  | ||||||
| def main(): |  | ||||||
|     calibration_countdown = 'initial' |  | ||||||
|     while True: |  | ||||||
|         time = datetime.now().replace(tzinfo=local_tz) |  | ||||||
|         hour = int(time.strftime("%-H")) |  | ||||||
|         month = int(time.now().strftime('%-m')) |  | ||||||
|         year = int(time.now().strftime('%Y')) |  | ||||||
|         mins = int(time.strftime("%M")) |  | ||||||
|         seconds = int(time.strftime("%S")) |  | ||||||
|         now = arrow.now(tz=system_tz) |  | ||||||
|  |  | ||||||
|         for i in range(1): |  | ||||||
|             print('_________Starting new loop___________'+'\n') |  | ||||||
|  |  | ||||||
|             """Start by printing the date and time for easier debugging""" |  | ||||||
|             print('Date:', time.strftime('%a %-d %b %y'), 'Time: '+time.strftime('%H:%M')+'\n') |  | ||||||
|  |  | ||||||
|             """At the hours specified in the settings file, |  | ||||||
|             calibrate the display to prevent ghosting""" |  | ||||||
|             if hour in calibration_hours: |  | ||||||
|                 if calibration_countdown is 'initial': |  | ||||||
|                     calibration_countdown = 0 |  | ||||||
|                     calibration() |  | ||||||
|                 else: |  | ||||||
|                     if calibration_countdown % (60 // int(update_interval)) is 0: |  | ||||||
|                         calibration() |  | ||||||
|                         calibration_countdown = 0 |  | ||||||
|  |  | ||||||
|             """Create a blank white page first""" |  | ||||||
|             image = Image.new('RGB', (EPD_HEIGHT, EPD_WIDTH), 'white') |  | ||||||
|  |  | ||||||
|             """Custom function to display text on the E-Paper""" |  | ||||||
|             def write_text(box_width, box_height, text, tuple, font=default, alignment='middle'): |  | ||||||
|                 text_width, text_height = font.getsize(text) |  | ||||||
|                 while (text_width, text_height) > (box_width, box_height): |  | ||||||
|                     text=text[0:-1] |  | ||||||
|                     text_width, text_height = font.getsize(text) |  | ||||||
|                 if alignment is "" or "middle" or None: |  | ||||||
|                     x = int((box_width / 2) - (text_width / 2)) |  | ||||||
|                 if alignment is 'left': |  | ||||||
|                     x = 0 |  | ||||||
|                 y = int((box_height / 2) - (text_height / 1.7)) |  | ||||||
|                 space = Image.new('RGB', (box_width, box_height), color='white') |  | ||||||
|                 ImageDraw.Draw(space).text((x, y), text, fill='black', font=font) |  | ||||||
|                 image.paste(space, tuple) |  | ||||||
|  |  | ||||||
|             """Check if internet is available by trying to reach google""" |  | ||||||
|             def internet_available(): |  | ||||||
|                 try: |  | ||||||
|                     urlopen('https://google.com',timeout=5) |  | ||||||
|                     return True |  | ||||||
|                 except URLError as err: |  | ||||||
|                     return False |  | ||||||
|  |  | ||||||
|             """Connect to Openweathermap API and fetch weather data""" |  | ||||||
|             if top_section is "Weather" and api_key != "" and owm.is_API_online() is True: |  | ||||||
|                 try: |  | ||||||
|                     print("Connecting to Openweathermap API servers...") |  | ||||||
|                     observation = owm.weather_at_place(location) |  | ||||||
|                     print("weather data:") |  | ||||||
|                     weather = observation.get_weather() |  | ||||||
|                     weathericon = weather.get_weather_icon_name() |  | ||||||
|                     Humidity = str(weather.get_humidity()) |  | ||||||
|                     cloudstatus = str(weather.get_clouds()) |  | ||||||
|                     weather_description = (str(weather.get_detailed_status())) |  | ||||||
|  |  | ||||||
|                     if units is "metric": |  | ||||||
|                         Temperature = str(int(weather.get_temperature(unit='celsius')['temp'])) |  | ||||||
|                         windspeed = str(int(weather.get_wind()['speed'])) |  | ||||||
|                         write_text(50, 35, Temperature + " °C", (334, 0)) |  | ||||||
|                         write_text(100, 35, windspeed+" km/h", (114, 0)) |  | ||||||
|  |  | ||||||
|                     if units is "imperial": |  | ||||||
|                         Temperature = str(int(weather.get_temperature('fahrenheit')['temp'])) |  | ||||||
|                         windspeed = str(int(weather.get_wind()['speed']*0.621)) |  | ||||||
|                         write_text(50, 35, Temperature + " °F", (334, 0)) |  | ||||||
|                         write_text(100, 35, windspeed+" mph", (114, 0)) |  | ||||||
|  |  | ||||||
|                     sunrisetime = arrow.get(weather.get_sunrise_time()).to(system_tz) |  | ||||||
|                     sunsettime = arrow.get(weather.get_sunset_time()).to(system_tz) |  | ||||||
|  |  | ||||||
|                     """Show the fetched weather data""" |  | ||||||
|                     print('Temperature:',Temperature, '°C') |  | ||||||
|                     print('Humidity:', Humidity, '%') |  | ||||||
|                     print('Wind speed:', windspeed, 'km/h') |  | ||||||
|                     print('Sunrise-time:', sunrisetime.format('HH:mm')) |  | ||||||
|                     print('Sunset time:', sunsettime.format('HH:mm')) |  | ||||||
|                     print('Cloudiness:', cloudstatus, '%') |  | ||||||
|                     print('Weather description:', weather_description, '\n') |  | ||||||
|  |  | ||||||
|                     """Add the weather icon at the top left corner""" |  | ||||||
|                     write_text(70,70, weathericons[weathericon], wiconplace, font = w_font_l) |  | ||||||
|  |  | ||||||
|                     """Add the temperature icon at it's position""" |  | ||||||
|                     write_text(35,35, '\uf055', tempplace, font = w_font_s) |  | ||||||
|  |  | ||||||
|                     """Add the humidity icon and display the humidity""" |  | ||||||
|                     write_text(35,35, '\uf07a', humplace, font = w_font_s) |  | ||||||
|                     write_text(50, 35, Humidity + " %", (334, 35)) |  | ||||||
|  |  | ||||||
|                     """Add the sunrise/sunset icon and display the time""" |  | ||||||
|                     if (now <= sunrisetime and now <= sunsettime) or (now >= sunrisetime and now >= sunsettime): |  | ||||||
|                         write_text(35,35, '\uf051', sunriseplace, font = w_font_s) |  | ||||||
|                         print('sunrise coming next') |  | ||||||
|                         if hours is "24": |  | ||||||
|                             write_text(50, 35, sunrisetime.format('H:mm'), (249, 0)) |  | ||||||
|                         if hours is "12": |  | ||||||
|                             write_text(50, 35, sunrisetime.format('h:mm'), (249, 0)) |  | ||||||
|  |  | ||||||
|                     if now >= sunrisetime and now <= sunsettime: |  | ||||||
|                         write_text(35,35, '\uf052', sunriseplace, font = w_font_s) |  | ||||||
|                         print('sunset coming next') |  | ||||||
|                         if hours is "24": |  | ||||||
|                             write_text(50, 35, sunsettime.format('H:mm'), (249, 0)) |  | ||||||
|                         if hours is "12": |  | ||||||
|                             write_text(50, 35, sunsettime.format('h:mm'), (249, 0)) |  | ||||||
|  |  | ||||||
|                     """Add the wind icon at it's position""" |  | ||||||
|                     write_text(35,35, '\uf050', windiconspace, font = w_font_s) |  | ||||||
|  |  | ||||||
|                     """Add a short weather description""" |  | ||||||
|                     write_text(229, 35, weather_description, (70, 35)) |  | ||||||
|  |  | ||||||
|                 except Exception as e: |  | ||||||
|                     """If no response was received from the openweathermap |  | ||||||
|                     api server, add the cloud with question mark""" |  | ||||||
|                     print('__________OWM-ERROR!__________'+'\n') |  | ||||||
|                     print('Reason: ',e,'\n') |  | ||||||
|                     write_text(70,70, '\uf07b', wiconplace, font = w_font_l) |  | ||||||
|                     pass |  | ||||||
|  |  | ||||||
|             """Set the Calendar to start on the day specified by the settings file """ |  | ||||||
|             if week_starts_on is "Monday": |  | ||||||
|                 calendar.setfirstweekday(calendar.MONDAY) |  | ||||||
|  |  | ||||||
|             """For those whose week starts on Sunday, change accordingly""" |  | ||||||
|             if week_starts_on is "Sunday": |  | ||||||
|                 calendar.setfirstweekday(calendar.SUNDAY) |  | ||||||
|  |  | ||||||
|             """Using the built-in calendar to generate the monthly Calendar |  | ||||||
|             template""" |  | ||||||
|             cal = calendar.monthcalendar(time.year, time.month) |  | ||||||
|  |  | ||||||
|             if middle_section is "Calendar": |  | ||||||
|                 """Add the icon with the current month's name""" |  | ||||||
|                 write_text(384,60, now.format('MMMM',locale=language), monthplace, font=month_font) |  | ||||||
|  |  | ||||||
|                 """Add the line seperating the weather and Calendar section""" |  | ||||||
|                 image.paste(seperator, seperatorplace) |  | ||||||
|  |  | ||||||
|                 """Create a list containing the weekday abbrevations for the |  | ||||||
|                 chosen language""" |  | ||||||
|                 if week_starts_on is "Monday": |  | ||||||
|                     prev_weekstart = now.replace(days = - now.weekday()) |  | ||||||
|                     image.paste(weekday, weekday_pos['pos'+str(now.weekday())], weekday) |  | ||||||
|                 if week_starts_on is "Sunday": |  | ||||||
|                     prev_weekstart = now.replace(days = - now.isoweekday()) |  | ||||||
|                     image.paste(weekday, weekday_pos['pos'+str(now.isoweekday())], weekday) |  | ||||||
|  |  | ||||||
|                 weekday_names_list = [] |  | ||||||
|                 for i in range(7): |  | ||||||
|                     weekday_name = prev_weekstart.replace(days=+i) |  | ||||||
|                     weekday_names_list.append(weekday_name.format('ddd',locale=language)) |  | ||||||
|  |  | ||||||
|                 for i in range(len(weekday_names_list)): |  | ||||||
|                     write_text(54, 28, weekday_names_list[i], weekday_pos['pos'+str(i)]) |  | ||||||
|  |  | ||||||
|                 """Create the calendar template of the current month""" |  | ||||||
|                 for numbers in cal[0]: |  | ||||||
|                     image.paste(im_open(dpath+str(numbers)+'.jpeg'), positions['a'+str(cal[0].index(numbers)+1)]) |  | ||||||
|                 for numbers in cal[1]: |  | ||||||
|                     image.paste(im_open(dpath+str(numbers)+'.jpeg'), positions['b'+str(cal[1].index(numbers)+1)]) |  | ||||||
|                 for numbers in cal[2]: |  | ||||||
|                     image.paste(im_open(dpath+str(numbers)+'.jpeg'), positions['c'+str(cal[2].index(numbers)+1)]) |  | ||||||
|                 for numbers in cal[3]: |  | ||||||
|                     image.paste(im_open(dpath+str(numbers)+'.jpeg'), positions['d'+str(cal[3].index(numbers)+1)]) |  | ||||||
|                 for numbers in cal[4]: |  | ||||||
|                     image.paste(im_open(dpath+str(numbers)+'.jpeg'), positions['e'+str(cal[4].index(numbers)+1)]) |  | ||||||
|                 if len(cal) is 6: |  | ||||||
|                     for numbers in cal[5]: |  | ||||||
|                         image.paste(im_open(dpath+str(numbers)+'.jpeg'), positions['f'+str(cal[5].index(numbers)+1)]) |  | ||||||
|  |  | ||||||
|                 """Draw a larger square on today's date""" |  | ||||||
|                 today = time.day |  | ||||||
|                 if today in cal[0]: |  | ||||||
|                     image.paste(dateicon, positions['a'+str(cal[0].index(today)+1)], dateicon) |  | ||||||
|                 if today in cal[1]: |  | ||||||
|                     image.paste(dateicon, positions['b'+str(cal[1].index(today)+1)], dateicon) |  | ||||||
|                 if today in cal[2]: |  | ||||||
|                     image.paste(dateicon, positions['c'+str(cal[2].index(today)+1)], dateicon) |  | ||||||
|                 if today in cal[3]: |  | ||||||
|                     image.paste(dateicon, positions['d'+str(cal[3].index(today)+1)], dateicon) |  | ||||||
|                 if today in cal[4]: |  | ||||||
|                     image.paste(dateicon, positions['e'+str(cal[4].index(today)+1)], dateicon) |  | ||||||
|                 if len(cal) is 6 and today in cal[5]: |  | ||||||
|                     image.paste(dateicon, positions['f'+str(cal[5].index(today)+1)], dateicon) |  | ||||||
|  |  | ||||||
|             """Add rss-feeds at the bottom section of the Calendar""" |  | ||||||
|             if bottom_section is "RSS" and rss_feeds != []: |  | ||||||
|  |  | ||||||
|                 """Custom function to display longer text into multiple lines (wrapping)""" |  | ||||||
|                 def multiline_text(text, max_width, font=default): |  | ||||||
|                     lines = [] |  | ||||||
|                     if font.getsize(text)[0] <= max_width: |  | ||||||
|                         lines.append(text) |  | ||||||
|                     else: |  | ||||||
|                         words = text.split(' ') |  | ||||||
|                         i = 0 |  | ||||||
|                         while i < len(words): |  | ||||||
|                             line = '' |  | ||||||
|                             while i < len(words) and font.getsize(line + words[i])[0] <= max_width: |  | ||||||
|                                 line = line + words[i] + " " |  | ||||||
|                                 i += 1 |  | ||||||
|                             if not line: |  | ||||||
|                                 line = words[i] |  | ||||||
|                                 i += 1 |  | ||||||
|                             lines.append(line) |  | ||||||
|                     return lines |  | ||||||
|  |  | ||||||
|                 """Parse the RSS-feed titles and save them to a list""" |  | ||||||
|                 rss_feed = [] |  | ||||||
|                 for feeds in rss_feeds: |  | ||||||
|                     text = feedparser.parse(feeds) |  | ||||||
|                     for posts in text.entries: |  | ||||||
|                         rss_feed.append(posts.summary)#title |  | ||||||
|  |  | ||||||
|                 """Shuffle the list to prevent displaying the same titles over and over""" |  | ||||||
|                 random.shuffle(rss_feed) |  | ||||||
|                 news = [] |  | ||||||
|  |  | ||||||
|                 """Remove all titles except the first 4 or 6, |  | ||||||
|                 depenfing on how much space is available on the """ |  | ||||||
|                 if middle_section is 'Calendar' and len(cal) is 5 or middle_section is 'Agenda': |  | ||||||
|                     del rss_feed[6:] |  | ||||||
|  |  | ||||||
|                 if len(cal) is 6: |  | ||||||
|                     del rss_feed[4:] |  | ||||||
|  |  | ||||||
|                 """Split titles of the rss feeds into lines that can fit |  | ||||||
|                 on the Calendar and add them to a list""" |  | ||||||
|                 for title in range(len(rss_feeds)): |  | ||||||
|                     news.append(multiline_text(rss_feed[title], 384)) |  | ||||||
|  |  | ||||||
|                 news = [j for i in news for j in i] |  | ||||||
|  |  | ||||||
|                 """Display the split lines of the titles""" |  | ||||||
|                 if middle_section is 'Calendar' and len(cal) is 5 or middle_section is 'Agenda': |  | ||||||
|                     if len(news) > 6: |  | ||||||
|                         del news[6:] |  | ||||||
|                     for lines in range(len(news)): |  | ||||||
|                         write_text(384, 25, news[lines], rss_places['line_'+str(lines+1)], alignment = 'left') |  | ||||||
|  |  | ||||||
|                 if len(cal) is 6: |  | ||||||
|                     if len(news) > 4: |  | ||||||
|                         del news[4:] |  | ||||||
|                     for lines in range(len(news)): |  | ||||||
|                         write_text(384, 25, news[lines], rss_places['line_'+str(lines+3)], alignment = 'left') |  | ||||||
|  |  | ||||||
|  |  | ||||||
|             if middle_section is "Calendar" or "Agenda": |  | ||||||
|                 """Algorithm for filtering and sorting events from your |  | ||||||
|                 iCalendar/s""" |  | ||||||
|                 events_this_month = [] |  | ||||||
|                 upcoming = [] |  | ||||||
|                 today = time.today() |  | ||||||
|  |  | ||||||
|                 """Create a time span using the events_max_range value (in days) |  | ||||||
|                 to filter events in that range""" |  | ||||||
|  |  | ||||||
|                 time_span_calendar = time + timedelta(days=int(events_max_range)) |  | ||||||
|                 time_span_agenda = time + timedelta(days=22) |  | ||||||
|  |  | ||||||
|                 if internet_available() is True: |  | ||||||
|                     print('Internet connection test passed'+'\n') |  | ||||||
|                     print('Fetching events from your calendar'+'\n') |  | ||||||
|                     for icalendars in ical_urls: |  | ||||||
|                         decode = str(urlopen(icalendars).read().decode()) |  | ||||||
|                         beginAlarmIndex = 0 |  | ||||||
|                         while beginAlarmIndex >= 0: |  | ||||||
|                             beginAlarmIndex = decode.find('BEGIN:VALARM') |  | ||||||
|                             if beginAlarmIndex >= 0: |  | ||||||
|                                 endAlarmIndex = decode.find('END:VALARM') |  | ||||||
|                                 decode = decode[:beginAlarmIndex] + decode[endAlarmIndex+12:] |  | ||||||
|                         ical = Calendar(decode) |  | ||||||
|                         for events in ical.events: |  | ||||||
|                             if events.begin.date().year == today.year and events.begin.date().month == today.month: |  | ||||||
|                                 if int((events.begin).format('D')) not in events_this_month: |  | ||||||
|                                     events_this_month.append(int((events.begin).format('D'))) |  | ||||||
|                             if middle_section is 'Agenda' and time <= events.end.datetime <= time_span_agenda: |  | ||||||
|                                 upcoming.append(events) |  | ||||||
|                             if middle_section is 'Calendar' and time <= events.end.datetime <= time_span_calendar: |  | ||||||
|                                 upcoming.append(events) |  | ||||||
|  |  | ||||||
|                     '''Fix some known bugs from ics.py''' |  | ||||||
|                     for events in upcoming: |  | ||||||
|                         if events.all_day and events.duration.days > 1: |  | ||||||
|                             events.end = events.end.replace(days=-2) |  | ||||||
|                             for i in range(1, events.duration.days): |  | ||||||
|                                 cc = events.clone() |  | ||||||
|                                 cc.begin = cc.begin.replace(days=+i) |  | ||||||
|                                 upcoming.append(cc) |  | ||||||
|  |  | ||||||
|                     for events in upcoming: |  | ||||||
|                         if events.begin.format('HH:mm') == '00:00': |  | ||||||
|                             events.make_all_day() |  | ||||||
|  |  | ||||||
|                     def event_begins(elem): |  | ||||||
|                         return elem.begin |  | ||||||
|  |  | ||||||
|                     upcoming.sort(key=event_begins) |  | ||||||
|  |  | ||||||
|                 else: |  | ||||||
|                     print("Could not fetch events from your iCalendar.") |  | ||||||
|                     print("Either the internet connection is too weak or we're offline.") |  | ||||||
|  |  | ||||||
|                 if middle_section is 'Agenda': |  | ||||||
|                     """For the agenda view, create a list containing dates and events of the next 22 days""" |  | ||||||
|                     if len(upcoming) is not 0: |  | ||||||
|                         while (upcoming[-1].begin.date().day - now.day) + len(upcoming) >= 22: |  | ||||||
|                             del upcoming[-1] |  | ||||||
|                     agenda_list = [] |  | ||||||
|                     for i in range(22): |  | ||||||
|                         date = now.replace(days=+i) |  | ||||||
|                         agenda_list.append({'value':date.format('ddd D MMM YY', locale=language),'type':'date'}) |  | ||||||
|                         for events in upcoming: |  | ||||||
|                             if events.begin.date().day == date.day: |  | ||||||
|                                 if not events.all_day: |  | ||||||
|                                     if hours is '24': |  | ||||||
|                                         agenda_list.append({'value':events.begin.to(system_tz).format('HH:mm')+ ' '+ str(events.name), 'type':'timed_event'}) |  | ||||||
|                                     if hours is '12': |  | ||||||
|                                         agenda_list.append({'value':events.begin.to(system_tz).format('hh:mm a')+ ' '+ str(events.name), 'type':'timed_event'}) |  | ||||||
|                                 else: |  | ||||||
|                                     agenda_list.append({'value':events.name, 'type':'full_day_event'}) |  | ||||||
|  |  | ||||||
|                     if bottom_section is not "": |  | ||||||
|                         del agenda_list[16:] |  | ||||||
|                         image.paste(seperator2, agenda_view_lines['line17']) |  | ||||||
|  |  | ||||||
|                     if bottom_section is "": |  | ||||||
|                         del agenda_list[22:] |  | ||||||
|                         image.paste(seperator2, agenda_view_lines['line22']) |  | ||||||
|  |  | ||||||
|                     for lines in range(len(agenda_list)): |  | ||||||
|                         if agenda_list[lines]['type'] is 'date': |  | ||||||
|                             write_text(384, 25, agenda_list[lines]['value'], agenda_view_lines['line'+str(lines+1)], font=semi, alignment='left') |  | ||||||
|                             image.paste(seperator2, agenda_view_lines['line'+str(lines+1)]) |  | ||||||
|                         elif agenda_list[lines]['type'] is 'timed_event': |  | ||||||
|                             write_text(384, 25, agenda_list[lines]['value'], agenda_view_lines['line'+str(lines+1)], alignment='left') |  | ||||||
|                         else: |  | ||||||
|                             write_text(384, 25, agenda_list[lines]['value'], agenda_view_lines['line'+str(lines+1)]) |  | ||||||
|  |  | ||||||
|             if middle_section is 'Calendar': |  | ||||||
|                 """Draw smaller squares on days with events""" |  | ||||||
|                 for numbers in events_this_month: |  | ||||||
|                     if numbers in cal[0]: |  | ||||||
|                         image.paste(eventicon, positions['a'+str(cal[0].index(numbers)+1)], eventicon) |  | ||||||
|                     if numbers in cal[1]: |  | ||||||
|                         image.paste(eventicon, positions['b'+str(cal[1].index(numbers)+1)], eventicon) |  | ||||||
|                     if numbers in cal[2]: |  | ||||||
|                         image.paste(eventicon, positions['c'+str(cal[2].index(numbers)+1)], eventicon) |  | ||||||
|                     if numbers in cal[3]: |  | ||||||
|                         image.paste(eventicon, positions['d'+str(cal[3].index(numbers)+1)], eventicon) |  | ||||||
|                     if numbers in cal[4]: |  | ||||||
|                         image.paste(eventicon, positions['e'+str(cal[4].index(numbers)+1)], eventicon) |  | ||||||
|                     if len(cal) is 6 and numbers in cal[5]: |  | ||||||
|                         image.paste(eventicon, positions['f'+str(cal[5].index(numbers)+1)], eventicon) |  | ||||||
|  |  | ||||||
|             """Write event dates and names on the E-Paper""" |  | ||||||
|             if bottom_section is "Events": |  | ||||||
|                 if len(cal) is 5: |  | ||||||
|                     del upcoming[6:] |  | ||||||
|                     for dates in range(len(upcoming)): |  | ||||||
|                         readable_date = upcoming[dates].begin.format('D MMM', locale=language) |  | ||||||
|                         write_text(70, 25, readable_date, date_positions['d'+str(dates+1)]) |  | ||||||
|                     for events in range(len(upcoming)): |  | ||||||
|                         write_text(314, 25, upcoming[events].name, event_positions['e'+str(events+1)], alignment = 'left') |  | ||||||
|  |  | ||||||
|                 if len(cal) is 6: |  | ||||||
|                     del upcoming[4:] |  | ||||||
|                     for dates in range(len(upcoming)): |  | ||||||
|                         readable_date = upcoming[dates].begin.format('D MMM', locale=language) |  | ||||||
|                         write_text(70, 25, readable_date, date_positions['d'+str(dates+3)]) |  | ||||||
|                     for events in range(len(upcoming)): |  | ||||||
|                         write_text(314, 25, upcoming[events].name, event_positions['e'+str(events+3)], alignment = 'left') |  | ||||||
|  |  | ||||||
|             'Show the time of the last update if set in the settings file' |  | ||||||
|             if show_last_update_time is 'True': |  | ||||||
|                 if hours is "24": |  | ||||||
|                     write_text(384, 25, 'Image created at '+now.format('H:mm'), (0, 615)) |  | ||||||
|                 if hours is "12": |  | ||||||
|                     write_text(384, 25, 'Image created at '+now.format('h:mm a'), (0, 615)) |  | ||||||
|  |  | ||||||
|  |  | ||||||
|             """ |  | ||||||
|             Map all pixels of the generated image to red, white and black |  | ||||||
|             so that the image can be displayed 'correctly' on the E-Paper |  | ||||||
|             """ |  | ||||||
|             buffer = np.array(image) |  | ||||||
|             r,g,b = buffer[:,:,0], buffer[:,:,1], buffer[:,:,2] |  | ||||||
|             if display_colours is "bwr": |  | ||||||
|                 buffer[np.logical_and(r > 245, g > 245)] = [255,255,255] #white |  | ||||||
|                 buffer[np.logical_and(r > 245, g < 245)] = [255,0,0] #red |  | ||||||
|                 buffer[np.logical_and(r != 255, r == g )] = [0,0,0] #black |  | ||||||
|  |  | ||||||
|             if display_colours is "bw": |  | ||||||
|                 buffer[np.logical_and(r > 245, g > 245)] = [255,255,255] #white |  | ||||||
|                 buffer[g < 255] = [0,0,0] #black |  | ||||||
|  |  | ||||||
|             improved_image = Image.fromarray(buffer).rotate(270, expand=True) |  | ||||||
|             print('Initialising E-Paper Display') |  | ||||||
|             epd.init() |  | ||||||
|             sleep(5) |  | ||||||
|             print('Converting image to data and sending it to the display') |  | ||||||
|             epd.display_frame(epd.get_frame_buffer(improved_image)) |  | ||||||
|             print('Data sent successfully') |  | ||||||
|             print('______Powering off the E-Paper until the next loop______'+'\n') |  | ||||||
|             epd.sleep() |  | ||||||
|  |  | ||||||
|             if middle_section is 'Calendar': |  | ||||||
|                 del events_this_month |  | ||||||
|                 del upcoming |  | ||||||
|                 del weekday_names_list |  | ||||||
|  |  | ||||||
|             if bottom_section is 'RSS': |  | ||||||
|                 del rss_feed |  | ||||||
|                 del news |  | ||||||
|  |  | ||||||
|             if middle_section is 'Agenda': |  | ||||||
|                 del agenda_list |  | ||||||
|  |  | ||||||
|             del buffer |  | ||||||
|             del image |  | ||||||
|             del improved_image |  | ||||||
|             gc.collect() |  | ||||||
|  |  | ||||||
|             if calibration_countdown is 'initial': |  | ||||||
|                 calibration_countdown = 0 |  | ||||||
|             calibration_countdown += 1 |  | ||||||
|  |  | ||||||
|             for i in range(1): |  | ||||||
|                 timings = [] |  | ||||||
|                 updates_per_hour = 60//int(update_interval) |  | ||||||
|  |  | ||||||
|                 for updates in range(updates_per_hour): |  | ||||||
|                     timings.append(60 - int(update_interval)*updates) |  | ||||||
|  |  | ||||||
|                 for update_times in timings: |  | ||||||
|                     if update_times >= mins: |  | ||||||
|                         sleep_for_minutes = update_times - mins |  | ||||||
|  |  | ||||||
|                 next_update_countdown = sleep_for_minutes*60 + (60-seconds) |  | ||||||
|  |  | ||||||
|                 print(sleep_for_minutes,'Minutes and ', (60-seconds),'Seconds left until next loop') |  | ||||||
|  |  | ||||||
|                 del timings |  | ||||||
|                 sleep(next_update_countdown) |  | ||||||
|  |  | ||||||
| if __name__ == '__main__': |  | ||||||
|     main() |  | ||||||
		Reference in New Issue
	
	Block a user