wasp: simulator: Add CST816S simulation
This commit is contained in:
parent
9664c394a6
commit
1ebafc083b
3 changed files with 89 additions and 18 deletions
|
@ -1,4 +1,4 @@
|
||||||
""" Simulated ST7789 display. """
|
""" Simulated ST7789 display and CST816S touchscreen. """
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import sdl2
|
import sdl2
|
||||||
|
@ -8,24 +8,18 @@ CASET = 0x2a
|
||||||
RASET = 0x2b
|
RASET = 0x2b
|
||||||
RAMWR = 0x2c
|
RAMWR = 0x2c
|
||||||
|
|
||||||
class ST7789Sim(object):
|
WIDTH = 240
|
||||||
def __init__(self, width=240, height=240):
|
HEIGHT = 240
|
||||||
sdl2.ext.init()
|
|
||||||
|
|
||||||
self.width = width
|
class ST7789Sim(object):
|
||||||
self.height = height
|
def __init__(self):
|
||||||
|
|
||||||
self.x = 0
|
self.x = 0
|
||||||
self.y = 0
|
self.y = 0
|
||||||
self.colclip = [0, width-1]
|
self.colclip = [0, WIDTH-1]
|
||||||
self.rowclip = [0, height-1]
|
self.rowclip = [0, HEIGHT-1]
|
||||||
self.cmd = 0
|
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):
|
def write(self, data):
|
||||||
if len(data) == 1:
|
if len(data) == 1:
|
||||||
# Assume if we get a byte at a time then it is command.
|
# 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]
|
self.y = self.rowclip[0]
|
||||||
|
|
||||||
elif self.cmd == RAMWR:
|
elif self.cmd == RAMWR:
|
||||||
pixelview = sdl2.ext.PixelView(self.windowsurface)
|
pixelview = sdl2.ext.PixelView(windowsurface)
|
||||||
|
|
||||||
half = False
|
half = False
|
||||||
for d in data:
|
for d in data:
|
||||||
|
@ -70,4 +64,61 @@ class ST7789Sim(object):
|
||||||
|
|
||||||
# Forcibly release the surface to ensure it is unlocked
|
# Forcibly release the surface to ensure it is unlocked
|
||||||
del pixelview
|
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()
|
||||||
|
|
|
@ -55,7 +55,7 @@ class SPI(object):
|
||||||
def __init__(self, id):
|
def __init__(self, id):
|
||||||
self._id = id
|
self._id = id
|
||||||
if id == 0:
|
if id == 0:
|
||||||
self.sim = display.ST7789Sim()
|
self.sim = display.spi_st7789_sim
|
||||||
else:
|
else:
|
||||||
self.sim = None
|
self.sim = None
|
||||||
|
|
||||||
|
@ -68,8 +68,22 @@ class SPI(object):
|
||||||
else:
|
else:
|
||||||
print("Sending data: " + str(buf))
|
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):
|
def lightsleep(ms=10):
|
||||||
"""TODO: This where we should manage the simulated components"""
|
display.tick()
|
||||||
time.sleep(ms / 1000)
|
time.sleep(ms / 1000)
|
||||||
|
|
||||||
def deepsleep(ms=10):
|
def deepsleep(ms=10):
|
||||||
|
|
|
@ -3,9 +3,11 @@ def sleep_ms(ms):
|
||||||
time.sleep(ms / 1000)
|
time.sleep(ms / 1000)
|
||||||
time.sleep_ms = sleep_ms
|
time.sleep_ms = sleep_ms
|
||||||
|
|
||||||
|
from machine import I2C
|
||||||
from machine import Pin
|
from machine import Pin
|
||||||
from machine import SPI
|
from machine import SPI
|
||||||
|
|
||||||
|
from drivers.cst816s import CST816S
|
||||||
from drivers.st7789 import ST7789_SPI
|
from drivers.st7789 import ST7789_SPI
|
||||||
from drivers.vibrator import Vibrator
|
from drivers.vibrator import Vibrator
|
||||||
|
|
||||||
|
@ -86,9 +88,13 @@ class RTC(object):
|
||||||
return (now[3], now[4], now[5])
|
return (now[3], now[4], now[5])
|
||||||
|
|
||||||
def uptime(self):
|
def uptime(self):
|
||||||
return time.time
|
return time.time()
|
||||||
|
|
||||||
|
def get_uptime_ms(self):
|
||||||
|
return int(time.time() * 1000)
|
||||||
|
|
||||||
display = Display()
|
display = Display()
|
||||||
|
touch = CST816S(I2C(0))
|
||||||
backlight = Backlight()
|
backlight = Backlight()
|
||||||
battery = Battery()
|
battery = Battery()
|
||||||
rtc = RTC()
|
rtc = RTC()
|
||||||
|
|
Loading…
Add table
Reference in a new issue