|
|
|
"""ILI9341 demo (bouncing boxes)."""
|
|
|
|
from machine import Pin, SPI
|
|
|
|
from random import random, seed
|
|
|
|
from ili9341 import Display, color565
|
|
|
|
from utime import sleep_us, ticks_cpu, ticks_us, ticks_diff
|
|
|
|
|
|
|
|
|
|
|
|
class Box(object):
|
|
|
|
"""Bouncing box."""
|
|
|
|
|
|
|
|
def __init__(self, screen_width, screen_height, size, display, color):
|
|
|
|
"""Initialize box.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
screen_width (int): Width of screen.
|
|
|
|
screen_height (int): Width of height.
|
|
|
|
size (int): Square side length.
|
|
|
|
display (ILI9341): display object.
|
|
|
|
color (int): RGB565 color value.
|
|
|
|
"""
|
|
|
|
self.size = size
|
|
|
|
self.w = screen_width
|
|
|
|
self.h = screen_height
|
|
|
|
self.display = display
|
|
|
|
self.color = color
|
|
|
|
# Generate non-zero random speeds between -5.0 and 5.0
|
|
|
|
seed(ticks_cpu())
|
|
|
|
r = random() * 10.0
|
|
|
|
self.x_speed = 5.0 - r if r < 5.0 else r - 10.0
|
|
|
|
r = random() * 10.0
|
|
|
|
self.y_speed = 5.0 - r if r < 5.0 else r - 10.0
|
|
|
|
|
|
|
|
self.x = self.w / 2.0
|
|
|
|
self.y = self.h / 2.0
|
|
|
|
self.prev_x = self.x
|
|
|
|
self.prev_y = self.y
|
|
|
|
|
|
|
|
def update_pos(self):
|
|
|
|
"""Update box position and speed."""
|
|
|
|
x = self.x
|
|
|
|
y = self.y
|
|
|
|
size = self.size
|
|
|
|
w = self.w
|
|
|
|
h = self.h
|
|
|
|
x_speed = abs(self.x_speed)
|
|
|
|
y_speed = abs(self.y_speed)
|
|
|
|
self.prev_x = x
|
|
|
|
self.prev_y = y
|
|
|
|
|
|
|
|
if x + size >= w - x_speed:
|
|
|
|
self.x_speed = -x_speed
|
|
|
|
elif x - size <= x_speed + 1:
|
|
|
|
self.x_speed = x_speed
|
|
|
|
|
|
|
|
if y + size >= h - y_speed:
|
|
|
|
self.y_speed = -y_speed
|
|
|
|
elif y - size <= y_speed + 1:
|
|
|
|
self.y_speed = y_speed
|
|
|
|
|
|
|
|
self.x = x + self.x_speed
|
|
|
|
self.y = y + self.y_speed
|
|
|
|
|
|
|
|
def draw(self):
|
|
|
|
"""Draw box."""
|
|
|
|
x = int(self.x)
|
|
|
|
y = int(self.y)
|
|
|
|
size = self.size
|
|
|
|
prev_x = int(self.prev_x)
|
|
|
|
prev_y = int(self.prev_y)
|
|
|
|
self.display.fill_hrect(prev_x - size,
|
|
|
|
prev_y - size,
|
|
|
|
size, size, 0)
|
|
|
|
self.display.fill_hrect(x - size,
|
|
|
|
y - size,
|
|
|
|
size, size, self.color)
|
|
|
|
|
|
|
|
|
|
|
|
def test():
|
|
|
|
"""Bouncing box."""
|
|
|
|
try:
|
|
|
|
# Baud rate of 40000000 seems about the max
|
|
|
|
spi = SPI(1, baudrate=40000000, sck=Pin(14), mosi=Pin(13))
|
|
|
|
display = Display(spi, dc=Pin(4), cs=Pin(16), rst=Pin(17))
|
|
|
|
display.clear()
|
|
|
|
|
|
|
|
colors = [color565(255, 0, 0),
|
|
|
|
color565(0, 255, 0),
|
|
|
|
color565(0, 0, 255),
|
|
|
|
color565(255, 255, 0),
|
|
|
|
color565(0, 255, 255),
|
|
|
|
color565(255, 0, 255)]
|
|
|
|
sizes = [12, 11, 10, 9, 8, 7]
|
|
|
|
boxes = [Box(239, 319, sizes[i], display,
|
|
|
|
colors[i]) for i in range(6)]
|
|
|
|
|
|
|
|
while True:
|
|
|
|
timer = ticks_us()
|
|
|
|
for b in boxes:
|
|
|
|
b.update_pos()
|
|
|
|
b.draw()
|
|
|
|
# Attempt to set framerate to 30 FPS
|
|
|
|
timer_dif = 33333 - ticks_diff(ticks_us(), timer)
|
|
|
|
if timer_dif > 0:
|
|
|
|
sleep_us(timer_dif)
|
|
|
|
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
display.cleanup()
|
|
|
|
|
|
|
|
|
|
|
|
test()
|