diff --git a/TODO.rst b/TODO.rst index 9cad328..320dab5 100644 --- a/TODO.rst +++ b/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) diff --git a/res/simulator_skin.png b/res/simulator_skin.png new file mode 100644 index 0000000..1f6de64 Binary files /dev/null and b/res/simulator_skin.png differ diff --git a/wasp/boards/simulator/display.py b/wasp/boards/simulator/display.py index 11b4701..9e5c622 100644 --- a/wasp/boards/simulator/display.py +++ b/wasp/boards/simulator/display.py @@ -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): - self.regs[1] = 5 - self.regs[4] = button.x - self.regs[6] = button.y + 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 + 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)