1
0
Fork 0

wasp: simulator: Add CST816S simulation

This commit is contained in:
Daniel Thompson 2020-03-07 11:50:26 +00:00
parent 9664c394a6
commit 1ebafc083b
3 changed files with 89 additions and 18 deletions

View file

@ -1,4 +1,4 @@
""" Simulated ST7789 display. """
""" Simulated ST7789 display and CST816S touchscreen. """
import sys
import sdl2
@ -8,24 +8,18 @@ CASET = 0x2a
RASET = 0x2b
RAMWR = 0x2c
class ST7789Sim(object):
def __init__(self, width=240, height=240):
sdl2.ext.init()
WIDTH = 240
HEIGHT = 240
self.width = width
self.height = height
class ST7789Sim(object):
def __init__(self):
self.x = 0
self.y = 0
self.colclip = [0, width-1]
self.rowclip = [0, height-1]
self.colclip = [0, WIDTH-1]
self.rowclip = [0, HEIGHT-1]
self.cmd = 0
self.window = sdl2.ext.Window("ST7789", size=(width, height))
self.window.show()
self.windowsurface = self.window.get_surface()
sdl2.ext.fill(self.windowsurface, (0, 0, 0))
def write(self, data):
if len(data) == 1:
# Assume if we get a byte at a time then it is command.
@ -44,7 +38,7 @@ class ST7789Sim(object):
self.y = self.rowclip[0]
elif self.cmd == RAMWR:
pixelview = sdl2.ext.PixelView(self.windowsurface)
pixelview = sdl2.ext.PixelView(windowsurface)
half = False
for d in data:
@ -70,4 +64,61 @@ class ST7789Sim(object):
# Forcibly release the surface to ensure it is unlocked
del pixelview
self.window.refresh()
window.refresh()
class CST816SSim():
def __init__(self):
self.regs = bytearray(64)
def readfrom_mem_into(self, addr, reg, dbuf):
tick()
if not self.regs[1]:
raise OSError
dbuf[:] = self.regs[reg:len(dbuf)+reg]
self.regs[1] = 0
def handle_key(self, key):
if key.keysym.sym == sdl2.SDLK_DOWN:
self.regs[1] = 1
elif key.keysym.sym == sdl2.SDLK_UP:
self.regs[1] = 2
elif key.keysym.sym == sdl2.SDLK_LEFT:
self.regs[1] = 3
elif key.keysym.sym == sdl2.SDLK_RIGHT:
self.regs[1] = 4
self.raise_interrupt()
def handle_mousebutton(self, button):
self.regs[1] = 5
self.regs[4] = button.x
self.regs[6] = button.y
self.raise_interrupt()
def raise_interrupt(self):
print('#INT')
sdl2.ext.init()
window = sdl2.ext.Window("ST7789", size=(WIDTH, HEIGHT))
window.show()
windowsurface = window.get_surface()
sdl2.ext.fill(windowsurface, (0, 0, 0))
spi_st7789_sim = ST7789Sim()
i2c_cst816s_sim = CST816SSim()
def tick():
events = sdl2.ext.get_events()
for event in events:
if event.type == sdl2.SDL_QUIT:
sdl2.ext.quit()
sys.exit(0)
elif event.type == sdl2.SDL_MOUSEBUTTONDOWN:
i2c_cst816s_sim.handle_mousebutton(event.button)
elif event.type == sdl2.SDL_KEYDOWN:
i2c_cst816s_sim.handle_key(event.key)
else:
#print(event)
pass
window.refresh()

View file

@ -55,7 +55,7 @@ class SPI(object):
def __init__(self, id):
self._id = id
if id == 0:
self.sim = display.ST7789Sim()
self.sim = display.spi_st7789_sim
else:
self.sim = None
@ -68,8 +68,22 @@ class SPI(object):
else:
print("Sending data: " + str(buf))
class I2C():
def __init__(self, id):
self.id = id
if id == 0:
self.sim = display.i2c_cst816s_sim
else:
self.sim = None
def readfrom_mem_into(self, addr, reg, dbuf):
if self.sim:
self.sim.readfrom_mem_into(addr, reg, dbuf)
else:
raise OSError
def lightsleep(ms=10):
"""TODO: This where we should manage the simulated components"""
display.tick()
time.sleep(ms / 1000)
def deepsleep(ms=10):

View file

@ -3,9 +3,11 @@ def sleep_ms(ms):
time.sleep(ms / 1000)
time.sleep_ms = sleep_ms
from machine import I2C
from machine import Pin
from machine import SPI
from drivers.cst816s import CST816S
from drivers.st7789 import ST7789_SPI
from drivers.vibrator import Vibrator
@ -86,9 +88,13 @@ class RTC(object):
return (now[3], now[4], now[5])
def uptime(self):
return time.time
return time.time()
def get_uptime_ms(self):
return int(time.time() * 1000)
display = Display()
touch = CST816S(I2C(0))
backlight = Backlight()
battery = Battery()
rtc = RTC()