@@ -180,6 +180,42 @@ def __init__(self, *, url=None, json_path=None, regexp_path=None,
180
180
except OSError :
181
181
self ._uselocal = False
182
182
183
+ if self ._debug :
184
+ print ("Init display" )
185
+ self .splash = displayio .Group (max_size = 15 )
186
+
187
+ if self ._debug :
188
+ print ("Init background" )
189
+ self ._bg_group = displayio .Group (max_size = 1 )
190
+ self ._bg_file = None
191
+ self ._default_bg = default_bg
192
+ self .splash .append (self ._bg_group )
193
+
194
+ # show thank you and bootup file if available
195
+ for bootscreen in ("/thankyou.bmp" , "/pyportal_startup.bmp" ):
196
+ try :
197
+ os .stat (bootscreen )
198
+ board .DISPLAY .show (self .splash )
199
+ for i in range (100 , - 1 , - 1 ): # dim down
200
+ self .set_backlight (i / 100 )
201
+ time .sleep (0.005 )
202
+ self .set_background (bootscreen )
203
+ board .DISPLAY .wait_for_frame ()
204
+ for i in range (100 ): # dim up
205
+ self .set_backlight (i / 100 )
206
+ time .sleep (0.005 )
207
+ time .sleep (2 )
208
+ except OSError :
209
+ pass # they removed it, skip!
210
+
211
+ self ._speaker_enable = DigitalInOut (board .SPEAKER_ENABLE )
212
+ self ._speaker_enable .switch_to_output (False )
213
+ self .audio = audioio .AudioOut (board .AUDIO_OUT )
214
+ try :
215
+ self .play_file ("pyportal_startup.wav" )
216
+ except OSError :
217
+ pass # they deleted the file, no biggie!
218
+
183
219
# Make ESP32 connection
184
220
if self ._debug :
185
221
print ("Init ESP32" )
@@ -207,6 +243,10 @@ def __init__(self, *, url=None, json_path=None, regexp_path=None,
207
243
requests .set_interface (self ._esp )
208
244
self ._connect_esp ()
209
245
246
+ # set the default background
247
+ self .set_background (self ._default_bg )
248
+ board .DISPLAY .show (self .splash )
249
+
210
250
if self ._debug :
211
251
print ("Init SD Card" )
212
252
sd_cs = DigitalInOut (board .SD_CS )
@@ -218,28 +258,6 @@ def __init__(self, *, url=None, json_path=None, regexp_path=None,
218
258
except OSError as error :
219
259
print ("No SD card found:" , error )
220
260
221
- self ._speaker_enable = DigitalInOut (board .SPEAKER_ENABLE )
222
- self ._speaker_enable .switch_to_output (False )
223
- self .audio = audioio .AudioOut (board .AUDIO_OUT )
224
-
225
- try :
226
- self .play_file ("pyportal_startup.wav" )
227
- except OSError :
228
- pass # they deleted the file, no biggie!
229
-
230
- if self ._debug :
231
- print ("Init display" )
232
- self .splash = displayio .Group (max_size = 15 )
233
- board .DISPLAY .show (self .splash )
234
-
235
- if self ._debug :
236
- print ("Init background" )
237
- self ._bg_group = displayio .Group (max_size = 1 )
238
- self ._bg_file = None
239
- self ._default_bg = default_bg
240
- self .set_background (self ._default_bg )
241
- self .splash .append (self ._bg_group )
242
-
243
261
self ._qr_group = None
244
262
245
263
if self ._debug :
@@ -571,19 +589,36 @@ def _connect_esp(self):
571
589
# secrets dictionary must contain 'ssid' and 'password' at a minimum
572
590
print ("Connecting to AP" , secrets ['ssid' ])
573
591
if secrets ['ssid' ] == 'CHANGE ME' or secrets ['ssid' ] == 'CHANGE ME' :
574
- print ("*" * 45 )
575
- print ("Please update the 'secrets.py' file on your" )
576
- print ("CIRCUITPY drive to include your local access" )
577
- print ("point SSID name in 'ssid' and SSID password" )
578
- print ("in 'password'. Then save to reload!" )
579
- print ("*" * 45 )
592
+ change_me = "\n " + "*" * 45
593
+ change_me += "\n Please update the 'secrets.py' file on your\n "
594
+ change_me += "CIRCUITPY drive to include your local WiFi\n "
595
+ change_me += "access point SSID name in 'ssid' and SSID\n "
596
+ change_me += "password in 'password'. Then save to reload!\n "
597
+ change_me += "*" * 45
598
+ raise OSError (change_me )
580
599
self .neo_status ((100 , 0 , 0 )) # red = not connected
581
600
try :
582
601
self ._esp .connect (secrets )
583
602
except RuntimeError as error :
584
603
print ("Cound not connect to internet" , error )
585
604
print ("Retrying in 3 seconds..." )
586
605
time .sleep (3 )
606
+
607
+ @staticmethod
608
+ def image_converter_url (image_url , width , height , color_depth = 16 ):
609
+ """Generate a converted image url from the url passed in,
610
+ with the given width and height. aio_username and aio_key must be
611
+ set in secrets."""
612
+ try :
613
+ aio_username = secrets ['aio_username' ]
614
+ aio_key = secrets ['aio_key' ]
615
+ except KeyError :
616
+ raise KeyError ("\n \n Our image converter service require a login/password to rate-limit. Please register for a freeadafruit.io account and place the user/key in your secrets file under 'aio_username' and 'aio_key'" )# pylint: disable=line-too-long
617
+
618
+ return IMAGE_CONVERTER_SERVICE % (aio_username , aio_key ,
619
+ width , height ,
620
+ color_depth , image_url )
621
+
587
622
def fetch (self ):
588
623
"""Fetch data from the url we initialized with, perfom any parsing,
589
624
and display text or graphics. This function does pretty much everything"""
@@ -655,17 +690,11 @@ def fetch(self):
655
690
gc .collect ()
656
691
657
692
if image_url :
658
- try :
659
- aio_username = secrets ['aio_username' ]
660
- aio_key = secrets ['aio_key' ]
661
- except KeyError :
662
- raise KeyError ("\n \n Our image converter service require a login/password to rate-limit. Please register for a freeadafruit.io account and place the user/key in your secrets file under 'aio_username' and 'aio_key'" )# pylint: disable=line-too-long
663
693
try :
664
694
print ("original URL:" , image_url )
665
- image_url = IMAGE_CONVERTER_SERVICE % (aio_username , aio_key ,
666
- self ._image_resize [0 ],
667
- self ._image_resize [1 ],
668
- 16 , image_url )
695
+ image_url = self .image_converter_url (image_url ,
696
+ self ._image_resize [0 ],
697
+ self ._image_resize [1 ])
669
698
print ("convert URL:" , image_url )
670
699
# convert image to bitmap and cache
671
700
#print("**not actually wgetting**")
@@ -708,7 +737,8 @@ def fetch(self):
708
737
if self ._text_wrap [i ]:
709
738
if self ._debug :
710
739
print ("Wrapping text" )
711
- string = '\n ' .join (PyPortal .wrap_nicely (string , self ._text_wrap [i ]))
740
+ lines = PyPortal .wrap_nicely (string , self ._text_wrap [i ])
741
+ string = '\n ' .join (lines )
712
742
self .set_text (string , index = i )
713
743
if len (values ) == 1 :
714
744
return values [0 ]
@@ -798,6 +828,7 @@ def wrap_nicely(string, max_chars):
798
828
:param int max_chars: The maximum number of characters on a line before wrapping.
799
829
800
830
"""
831
+ string = string .replace ('\n ' , '' ).replace ('\r ' , '' ) # strip confusing newlines
801
832
words = string .split (' ' )
802
833
the_lines = []
803
834
the_line = ""
@@ -811,4 +842,6 @@ def wrap_nicely(string, max_chars):
811
842
the_line = '' + w
812
843
if the_line : # last line remaining
813
844
the_lines .append (the_line )
845
+ # remove first space from first line:
846
+ the_lines [0 ] = the_lines [0 ][1 :]
814
847
return the_lines
0 commit comments