2
2
#
3
3
# SPDX-License-Identifier: Unlicense
4
4
import 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
11
5
from adafruit_oauth2 import OAuth2
12
6
from adafruit_display_shapes .line import Line
13
- from adafruit_bitmap_font import bitmap_font
14
- from adafruit_display_text import label
15
7
from adafruit_pyportal import PyPortal
16
8
import rtc
17
9
60
52
print ("WiFi secrets are kept in secrets.py, please add them there!" )
61
53
raise
62
54
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
-
80
55
# Create the PyPortal object
81
- pyportal = PyPortal (esp = esp , external_spi = spi )
56
+ pyportal = PyPortal ()
82
57
r = rtc .RTC ()
83
58
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
+
87
61
88
62
# Initialize an OAuth2 object with GCal API scope
89
63
scopes = ["https://www.googleapis.com/auth/calendar.readonly" ]
90
64
google_auth = OAuth2 (
91
- requests ,
65
+ pyportal . network . requests ,
92
66
secrets ["google_client_id" ],
93
67
secrets ["google_client_secret" ],
94
68
scopes ,
@@ -105,15 +79,17 @@ def get_current_time(time_max=False):
105
79
cur_time = r .datetime
106
80
if time_max : # maximum time to fetch events is midnight (4:59:59UTC)
107
81
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
+ )
117
93
)
118
94
cur_time = cur_time_max
119
95
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):
145
121
"/events?maxResults={1}&timeMin={2}&timeMax={3}&orderBy=startTime"
146
122
"&singleEvents=true" .format (calendar_id , max_events , time_min , time_max )
147
123
)
148
- resp = requests .get (url , headers = headers )
124
+ resp = pyportal . network . requests .get (url , headers = headers )
149
125
resp_json = resp .json ()
150
126
if "error" in resp_json :
151
127
raise RuntimeError ("Error:" , resp_json )
@@ -191,6 +167,22 @@ def format_datetime(datetime, pretty_date=False):
191
167
return formatted_time
192
168
193
169
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
+
194
186
def display_calendar_events (resp_events ):
195
187
# Display all calendar events
196
188
for event_idx in range (len (resp_events )):
@@ -203,39 +195,31 @@ def display_calendar_events(resp_events):
203
195
print ("Event Description: " , event_name )
204
196
print ("Event Time:" , format_datetime (event_start ))
205
197
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 ])
225
205
226
206
227
207
pyportal .set_background (0xFFFFFF )
228
208
209
+ # Set up calendar event fonts
210
+ font_events = "fonts/Arial-14.pcf"
211
+
229
212
# Add the header
230
213
line_header = Line (0 , 50 , 320 , 50 , color = 0x000000 )
231
214
pyportal .splash .append (line_header )
232
215
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 ()
239
223
240
224
if not google_auth .refresh_access_token ():
241
225
raise RuntimeError ("Unable to refresh access token - has the token been revoked?" )
@@ -260,20 +244,13 @@ def display_calendar_events(resp_events):
260
244
now = get_current_time ()
261
245
262
246
# 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 )
269
248
270
249
print ("fetching calendar events..." )
271
250
events = get_calendar_events (CALENDAR_ID , MAX_EVENTS , now )
272
251
273
252
print ("displaying events" )
274
253
display_calendar_events (events )
275
254
276
- board .DISPLAY .show (pyportal .splash )
277
-
278
255
print ("Sleeping for %d minutes" % REFRESH_TIME )
279
256
time .sleep (REFRESH_TIME * 60 )
0 commit comments