pimoroni-pico/micropython/examples/inky_frame/inky_frame_random_joke.py

91 lines
2.7 KiB
Python

import gc
import uos
import random
import machine
import jpegdec
import WIFI_CONFIG
import uasyncio
from network_manager import NetworkManager
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
from picographics import PicoGraphics, DISPLAY_INKY_FRAME_7 as DISPLAY # 7.3"
from urllib import urequest
gc.collect() # We're really gonna need that RAM!
def status_handler(mode, status, ip):
print(mode, status, ip)
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
uasyncio.get_event_loop().run_until_complete(network_manager.client(WIFI_CONFIG.SSID, WIFI_CONFIG.PSK))
graphics = PicoGraphics(DISPLAY)
WIDTH, HEIGHT = graphics.get_bounds()
FILENAME = "/sd/random-joke.jpg"
JOKE_IDS = "https://pimoroni.github.io/feed2image/jokeapi-ids.txt"
JOKE_IMG = "https://pimoroni.github.io/feed2image/jokeapi-{}-{}x{}.jpg"
import sdcard # noqa: E402 - putting this at the top causes an MBEDTLS OOM error!?
sd_spi = machine.SPI(0, sck=machine.Pin(18, machine.Pin.OUT), mosi=machine.Pin(19, machine.Pin.OUT), miso=machine.Pin(16, machine.Pin.OUT))
sd = sdcard.SDCard(sd_spi, machine.Pin(22))
uos.mount(sd, "/sd")
gc.collect() # Claw back some RAM!
# We don't have the RAM to store the list of Joke IDs in memory.
# the first line of `jokeapi-ids.txt` is a COUNT of IDs.
# Grab it, then pick a random line between 0 and COUNT.
# Seek to that line and ...y'know... there's our totally random joke ID
socket = urequest.urlopen(JOKE_IDS)
# Get the first line, which is a count of the joke IDs
number_of_lines = int(socket.readline().decode("ascii"))
print("Total jokes {}".format(number_of_lines))
# Pick a random joke (by its line number)
line = random.randint(0, number_of_lines)
print("Getting ID from line {}".format(line))
for x in range(line): # Throw away lines to get where we need
socket.readline()
# Read our chosen joke ID!
random_joke_id = int(socket.readline().decode("ascii"))
socket.close()
print("Random joke ID: {}".format(random_joke_id))
url = JOKE_IMG.format(random_joke_id, WIDTH, HEIGHT)
socket = urequest.urlopen(url)
# Stream the image data from the socket onto disk in 1024 byte chunks
# the 600x448-ish jpeg will be roughly ~24k, we really don't have the RAM!
data = bytearray(1024)
with open(FILENAME, "wb") as f:
while True:
if socket.readinto(data) == 0:
break
f.write(data)
socket.close()
del data
gc.collect() # We really are tight on RAM!
jpeg = jpegdec.JPEG(graphics)
gc.collect() # For good measure...
graphics.set_pen(1)
graphics.clear()
jpeg.open_file(FILENAME)
jpeg.decode()
graphics.update()