22#
33# SPDX-License-Identifier: Unlicense
44import time
5- import board
6- import busio
7- from digitalio import DigitalInOut
8- import adafruit_esp32spi .adafruit_esp32spi_socket as socket
9- from adafruit_esp32spi import adafruit_esp32spi
10- import adafruit_requests as requests
115from adafruit_oauth2 import OAuth2
126from adafruit_display_shapes .line import Line
13- from adafruit_bitmap_font import bitmap_font
14- from adafruit_display_text import label
157from adafruit_pyportal import PyPortal
168import rtc
179
6052 print ("WiFi secrets are kept in secrets.py, please add them there!" )
6153 raise
6254
63- # If you are using a board with pre-defined ESP32 Pins:
64- esp32_cs = DigitalInOut (board .ESP_CS )
65- esp32_ready = DigitalInOut (board .ESP_BUSY )
66- esp32_reset = DigitalInOut (board .ESP_RESET )
67-
68- spi = busio .SPI (board .SCK , board .MOSI , board .MISO )
69- esp = adafruit_esp32spi .ESP_SPIcontrol (spi , esp32_cs , esp32_ready , esp32_reset )
70-
71- print ("Connecting to AP..." )
72- while not esp .is_connected :
73- try :
74- esp .connect_AP (secrets ["ssid" ], secrets ["password" ])
75- except RuntimeError as e :
76- print ("could not connect to AP, retrying: " , e )
77- continue
78- print ("Connected to" , str (esp .ssid , "utf-8" ), "\t RSSI:" , esp .rssi )
79-
8055# Create the PyPortal object
81- pyportal = PyPortal (esp = esp , external_spi = spi )
56+ pyportal = PyPortal ()
8257r = rtc .RTC ()
8358
84- # Initialize a requests object with a socket and esp32spi interface
85- socket .set_interface (esp )
86- requests .set_socket (socket , esp )
59+ pyportal .network .connect ()
60+
8761
8862# Initialize an OAuth2 object with GCal API scope
8963scopes = ["https://www.googleapis.com/auth/calendar.readonly" ]
9064google_auth = OAuth2 (
91- requests ,
65+ pyportal . network . requests ,
9266 secrets ["google_client_id" ],
9367 secrets ["google_client_secret" ],
9468 scopes ,
@@ -105,15 +79,17 @@ def get_current_time(time_max=False):
10579 cur_time = r .datetime
10680 if time_max : # maximum time to fetch events is midnight (4:59:59UTC)
10781 cur_time_max = time .struct_time (
108- cur_time [0 ],
109- cur_time [1 ],
110- cur_time [2 ] + 1 ,
111- 4 ,
112- 59 ,
113- 59 ,
114- cur_time [6 ],
115- cur_time [7 ],
116- cur_time [8 ],
82+ (
83+ cur_time [0 ],
84+ cur_time [1 ],
85+ cur_time [2 ] + 1 ,
86+ 4 ,
87+ 59 ,
88+ 59 ,
89+ cur_time [6 ],
90+ cur_time [7 ],
91+ cur_time [8 ],
92+ )
11793 )
11894 cur_time = cur_time_max
11995 cur_time = "{:04d}-{:02d}-{:02d}T{:02d}:{:02d}:{:02d}{:s}" .format (
@@ -145,7 +121,7 @@ def get_calendar_events(calendar_id, max_events, time_min):
145121 "/events?maxResults={1}&timeMin={2}&timeMax={3}&orderBy=startTime"
146122 "&singleEvents=true" .format (calendar_id , max_events , time_min , time_max )
147123 )
148- resp = requests .get (url , headers = headers )
124+ resp = pyportal . network . requests .get (url , headers = headers )
149125 resp_json = resp .json ()
150126 if "error" in resp_json :
151127 raise RuntimeError ("Error:" , resp_json )
@@ -191,6 +167,22 @@ def format_datetime(datetime, pretty_date=False):
191167 return formatted_time
192168
193169
170+ def create_event_labels ():
171+ for event_idx in range (MAX_EVENTS ):
172+ event_start_label = pyportal .add_text (
173+ text_font = font_events ,
174+ text_position = (7 , 70 + (event_idx * 40 )),
175+ text_color = 0x000000 ,
176+ )
177+ event_text_label = pyportal .add_text (
178+ text_font = font_events ,
179+ text_position = (88 , 70 + (event_idx * 40 )),
180+ text_color = 0x000000 ,
181+ line_spacing = 0.75 ,
182+ )
183+ event_labels .append ((event_start_label , event_text_label ))
184+
185+
194186def display_calendar_events (resp_events ):
195187 # Display all calendar events
196188 for event_idx in range (len (resp_events )):
@@ -203,39 +195,31 @@ def display_calendar_events(resp_events):
203195 print ("Event Description: " , event_name )
204196 print ("Event Time:" , format_datetime (event_start ))
205197 print ("-" * 40 )
206- # Generate labels holding event info
207- label_event_time = label .Label (
208- font_events ,
209- x = 7 ,
210- y = 70 + (event_idx * 40 ),
211- color = 0x000000 ,
212- text = format_datetime (event_start ),
213- )
214- pyportal .splash .append (label_event_time )
215-
216- label_event_desc = label .Label (
217- font_events ,
218- x = 88 ,
219- y = 70 + (event_idx * 40 ),
220- color = 0x000000 ,
221- text = event_name ,
222- line_spacing = 0.75 ,
223- )
224- pyportal .splash .append (label_event_desc )
198+ pyportal .set_text (format_datetime (event_start ), event_labels [event_idx ][0 ])
199+ pyportal .set_text (event_name , event_labels [event_idx ][1 ])
200+
201+ # Clear any unused labels
202+ for event_idx in range (len (resp_events ), MAX_EVENTS ):
203+ pyportal .set_text ("" , event_labels [event_idx ][0 ])
204+ pyportal .set_text ("" , event_labels [event_idx ][1 ])
225205
226206
227207pyportal .set_background (0xFFFFFF )
228208
209+ # Set up calendar event fonts
210+ font_events = "fonts/Arial-14.pcf"
211+
229212# Add the header
230213line_header = Line (0 , 50 , 320 , 50 , color = 0x000000 )
231214pyportal .splash .append (line_header )
232215
233- font_h1 = bitmap_font .load_font ("fonts/Arial-18.pcf" )
234- label_header = label .Label (font_h1 , x = 10 , y = 30 , color = 0x000000 )
235- pyportal .splash .append (label_header )
236-
237- # Set up calendar event fonts
238- font_events = bitmap_font .load_font ("fonts/Arial-14.pcf" )
216+ label_header = pyportal .add_text (
217+ text_font = "fonts/Arial-18.pcf" ,
218+ text_position = (10 , 30 ),
219+ text_color = 0x000000 ,
220+ )
221+ event_labels = []
222+ create_event_labels ()
239223
240224if not google_auth .refresh_access_token ():
241225 raise RuntimeError ("Unable to refresh access token - has the token been revoked?" )
@@ -260,20 +244,13 @@ def display_calendar_events(resp_events):
260244 now = get_current_time ()
261245
262246 # setup header label
263- label_header .text = format_datetime (now , pretty_date = True )
264-
265- # remove previous event time labels and event description labels
266- for _ in range (len (events * 2 )):
267- print ("removing event label..." )
268- pyportal .splash .pop ()
247+ pyportal .set_text (format_datetime (now , pretty_date = True ), label_header )
269248
270249 print ("fetching calendar events..." )
271250 events = get_calendar_events (CALENDAR_ID , MAX_EVENTS , now )
272251
273252 print ("displaying events" )
274253 display_calendar_events (events )
275254
276- board .DISPLAY .show (pyportal .splash )
277-
278255 print ("Sleeping for %d minutes" % REFRESH_TIME )
279256 time .sleep (REFRESH_TIME * 60 )
0 commit comments