197 lines
5.4 KiB
Python
197 lines
5.4 KiB
Python
'''
|
|
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 WIFI_CONFIG
|
|
import time
|
|
from gfx_pack import GfxPack, SWITCH_A, SWITCH_B, SWITCH_D, SWITCH_E
|
|
from network_manager import NetworkManager
|
|
import urequests
|
|
import uasyncio
|
|
|
|
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:
|
|
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:
|
|
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)
|