""" zoo_facts.py This example is for the Pico W with GFX Pack. It uses the Zoo Animal API to download a list of 5 animals, then displays them on the GFX Pack A = Next animal B = Last animal D = Show stats E = Fetch a different 5 animals Find out more about Zoo Animal API here: https://zoo-animal-api.herokuapp.com/ """ import time import uasyncio import urequests import WIFI_CONFIG from gfx_pack import SWITCH_A, SWITCH_B, SWITCH_D, SWITCH_E, GfxPack from network_manager import NetworkManager URL = "https://zoo-animal-api.herokuapp.com/animals/rand/5" gp = GfxPack() display = gp.display WIDTH, HEIGHT = display.get_bounds() display.set_backlight(0.5) # turn off the white component of the backlight animals = [] animal_number = 0 stat_page = False sys_status = "STATUS" # Data class for containing the animal facts class Animal: def __init__(self): self.name = "" self.latin_name = "" self.animal_type = "" self.habitat = "" self.diet = "" self.length_max = "" self.weight_max = "" self.lifespan = "" def process_json(self, json): print(json["name"]) self.name = json["name"] self.latin_name = json["latin_name"] self.animal_type = json["animal_type"] self.habitat = json["habitat"] self.diet = json["diet"] self.length_max = json["length_max"] self.weight_max = json["weight_max"] self.lifespan = json["lifespan"] def get_data(): # open the json file print(f"Requesting URL: {URL}") r = urequests.get(URL) # open the json data j = r.json() print("Data obtained!") r.close() return j def get_animals(): global sys_status animals = [] sys_status = "Getting Animals" display_status() display.update() json_data = get_data() for index in range(len(json_data)): new_animal = Animal() new_animal.process_json(json_data[index]) animals.append(new_animal) return animals def display_status(): global sys_status display.set_pen(0) # Set pen to white display.clear() display.set_pen(15) display.text(sys_status, 0, 0, WIDTH, 1) display.update() def status_handler(mode, status, ip): # reports wifi connection status global sys_status print(mode, status, ip) sys_status = "Mode: {0} Connected: {1} IP: {2}".format(mode, status, ip) display_status() display.update() print("Connecting to wifi...") if status is not None: if status: print("Wifi connection successful!") else: print("Wifi connection failed!") def display_animal(animal, stat_page): display.set_pen(0) # Set pen to white display.clear() display.set_pen(15) if stat_page is False: display.text("Animal Info {0}".format(animal_number), 0, 0, WIDTH, 1) display.text("Name: {0}".format(animal.name[:19]), 0, 10, WIDTH, 1) display.text("Latin: {0}".format(animal.latin_name[:19]), 0, 20, WIDTH, 1) display.text("Type: {0}".format(animal.animal_type[:19]), 0, 30, WIDTH, 1) display.text("Habitat: {0}".format(animal.habitat[:19]), 0, 40, WIDTH, 1) display.text("Diet: {0}".format(animal.diet[:19]), 0, 50, WIDTH, 1) else: display.text("Animal Stats {0}".format(animal_number), 0, 0, WIDTH, 1) display.text("Max Length: {0}".format(animal.length_max), 0, 10, WIDTH, 1) display.text("Max Weight: {0}".format(animal.weight_max), 0, 20, WIDTH, 1) display.text("Lifespan: {0}".format(animal.lifespan), 0, 30, WIDTH, 1) display.update() try: 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)) except Exception as e: # noqa: BLE001 print(f"Wifi connection failed! {e}") # From CPython Lib/colorsys.py def hsv_to_rgb(h, s, v): if s == 0.0: return v, v, v i = int(h * 6.0) f = (h * 6.0) - i p = v * (1.0 - s) q = v * (1.0 - s * f) t = v * (1.0 - s * (1.0 - f)) i = i % 6 if i == 0: return v, t, p if i == 1: return q, v, p if i == 2: return p, v, t if i == 3: return p, q, v if i == 4: return t, p, v if i == 5: # noqa: RET503 return v, p, q # some variables to keep track of rainbow background h = 0 display.set_font("bitmap8") animals = get_animals() display.set_backlight(0) while True: h += 1 r, g, b = [int(255 * c) for c in hsv_to_rgb(h / 360.0, 1.0, 1.0)] # rainbow magic gp.set_backlight(r, g, b) # Set backlight to a converted HSV value display.set_pen(0) # Set pen to white display.clear() display.set_pen(15) # Set pen to black # Draw text display_animal(animals[animal_number], stat_page) if gp.switch_pressed(SWITCH_B): animal_number += 1 if animal_number > 4: animal_number = 0 display_animal(animals[animal_number], stat_page) time.sleep(0.4) elif gp.switch_pressed(SWITCH_A): animal_number -= 1 if animal_number < 0: animal_number = 4 display_animal(animals[animal_number], stat_page) time.sleep(0.4) elif gp.switch_pressed(SWITCH_D): stat_page = not stat_page display_animal(animals[animal_number], stat_page) time.sleep(0.4) elif gp.switch_pressed(SWITCH_E): animals = get_animals() display_animal(animals[animal_number], stat_page)