boards: simulator: Add swipe detection and button support
Currently the simulator relies on the keyboard to issue touchscreen gestures and button presses. Fix this by adding swipe detection and introducing a skin which gives us the capability to press the button using touchscreens or pointer devices. Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
This commit is contained in:
parent
b7e7164d59
commit
7b3e0f917d
3 changed files with 65 additions and 8 deletions
5
TODO.rst
5
TODO.rst
|
@ -144,3 +144,8 @@ Wasp-os
|
|||
* [ ] Debugging and troubleshooting guide
|
||||
* [ ] Screenshots for bootloader and all applications
|
||||
* [ ] Improve the install guide
|
||||
|
||||
* [X] Simulator
|
||||
|
||||
* [X] Add a simple skin for better screenshots
|
||||
* [X] Full swipe detection (avoid keyboard)
|
||||
|
|
BIN
res/simulator_skin.png
Normal file
BIN
res/simulator_skin.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
|
@ -14,6 +14,13 @@ RAMWR = 0x2c
|
|||
WIDTH = 240
|
||||
HEIGHT = 240
|
||||
|
||||
SKIN = {
|
||||
'fname' : 'res/simulator_skin.png',
|
||||
'size' : (337, 427),
|
||||
'button_profile' : 9,
|
||||
'offset' : (53, 93)
|
||||
}
|
||||
|
||||
class ST7789Sim(object):
|
||||
def __init__(self):
|
||||
|
||||
|
@ -60,7 +67,9 @@ class ST7789Sim(object):
|
|||
((rgb & 0x07e0) << 5) +
|
||||
((rgb & 0x001f) << 3))
|
||||
|
||||
pixelview[self.x][self.y] = pixel
|
||||
pv_x = self.x + SKIN['adjust'][0]
|
||||
pv_y = self.y + SKIN['adjust'][1]
|
||||
pixelview[pv_x][pv_y] = pixel
|
||||
|
||||
self.x += 1
|
||||
if self.x > self.colclip[1]:
|
||||
|
@ -118,20 +127,61 @@ class CST816SSim():
|
|||
self.regs[3] = 0x80
|
||||
self.raise_interrupt(pins)
|
||||
|
||||
def handle_mousebutton(self, button, pins):
|
||||
def handle_mousebuttondown(self, button, pins):
|
||||
self.down_x = button.x
|
||||
self.down_y = button.y
|
||||
|
||||
if self.down_x < 50:
|
||||
pins['BUTTON'].value(0)
|
||||
|
||||
|
||||
def handle_mousebuttonup(self, button, pins):
|
||||
if self.down_x < 50:
|
||||
pins['BUTTON'].value(1)
|
||||
return
|
||||
|
||||
down_x = max(0, min(239, self.down_x-SKIN['adjust'][0]))
|
||||
down_y = max(0, min(239, self.down_y-SKIN['adjust'][1]))
|
||||
up_x = max(0, min(239, button.x-SKIN['adjust'][0]))
|
||||
up_y = max(0, min(239, button.y-SKIN['adjust'][1]))
|
||||
mv_x = up_x - down_x
|
||||
mv_y = up_y - down_y
|
||||
|
||||
# Swipe detection
|
||||
if abs(mv_x) + abs(mv_y) < 24:
|
||||
self.regs[1] = 5
|
||||
self.regs[4] = button.x
|
||||
self.regs[6] = button.y
|
||||
elif abs(mv_x) > abs(mv_y):
|
||||
self.regs[1] = 4 if mv_x > 0 else 3
|
||||
else:
|
||||
self.regs[1] = 2 if mv_y > 0 else 1
|
||||
|
||||
self.regs[4] = up_x;
|
||||
self.regs[6] = up_y;
|
||||
self.raise_interrupt(pins)
|
||||
|
||||
def raise_interrupt(self, pins):
|
||||
pins['TP_INT'].raise_irq()
|
||||
|
||||
# Derive some extra values for padding the display
|
||||
SKIN['left_pad'] = 9
|
||||
SKIN['right_pad'] = SKIN['left_pad'] + SKIN['button_profile']
|
||||
SKIN['top_pad'] = 3
|
||||
SKIN['bottom_pad'] = 3
|
||||
SKIN['window'] = (SKIN['size'][0] + SKIN['left_pad'] + SKIN['right_pad'],
|
||||
SKIN['size'][1] + SKIN['top_pad'] + SKIN['bottom_pad'])
|
||||
SKIN['adjust'] = (SKIN['offset'][0] + SKIN['left_pad'],
|
||||
SKIN['offset'][1] + SKIN['top_pad'])
|
||||
|
||||
sdl2.ext.init()
|
||||
window = sdl2.ext.Window("ST7789", size=(WIDTH, HEIGHT))
|
||||
window = sdl2.ext.Window("ST7789", size=SKIN['window'])
|
||||
window.show()
|
||||
windowsurface = window.get_surface()
|
||||
sdl2.ext.fill(windowsurface, (0, 0, 0))
|
||||
sdl2.ext.fill(windowsurface, (0xff, 0xff, 0xff))
|
||||
skin = sdl2.ext.load_image(SKIN['fname'])
|
||||
sdl2.SDL_BlitSurface(skin, None, windowsurface, sdl2.SDL_Rect(
|
||||
SKIN['left_pad'], SKIN['top_pad'], SKIN['size'][0], SKIN['size'][1]))
|
||||
sdl2.SDL_FreeSurface(skin)
|
||||
window.refresh()
|
||||
|
||||
spi_st7789_sim = ST7789Sim()
|
||||
i2c_cst816s_sim = CST816SSim()
|
||||
|
@ -143,7 +193,9 @@ def tick(pins):
|
|||
sdl2.ext.quit()
|
||||
sys.exit(0)
|
||||
elif event.type == sdl2.SDL_MOUSEBUTTONDOWN:
|
||||
i2c_cst816s_sim.handle_mousebutton(event.button, pins)
|
||||
i2c_cst816s_sim.handle_mousebuttondown(event.button, pins)
|
||||
elif event.type == sdl2.SDL_MOUSEBUTTONUP:
|
||||
i2c_cst816s_sim.handle_mousebuttonup(event.button, pins)
|
||||
elif event.type == sdl2.SDL_KEYDOWN:
|
||||
if event.key.keysym.sym == sdl2.SDLK_TAB:
|
||||
pins['BUTTON'].value(0)
|
||||
|
|
Loading…
Reference in a new issue