Skip to content
This repository has been archived by the owner on Dec 23, 2021. It is now read-only.

Commit

Permalink
Clue Terminal and Context Fixes (#290)
Browse files Browse the repository at this point in the history
Terminal and Screen Updating Fix
  • Loading branch information
andreamah committed Apr 2, 2020
1 parent 84c9bdf commit 9d569da
Show file tree
Hide file tree
Showing 19 changed files with 351 additions and 77 deletions.
Binary file modified adafruit-circuitpython-display-text-DSX_CUSTOM_MAR172020.tar.gz
Binary file not shown.
6 changes: 6 additions & 0 deletions src/base_circuitpython/base_cp_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
IMG_DIR_NAME = "img"
SCREEN_HEIGHT_WIDTH = 240

BLINKA_BMP = "blinka.bmp"
CLUE_TERMINAL_LINE_HEIGHT = 16
CLUE_TERMINAL_LINE_NUM_MAX = 15
CLUE_TERMINAL_X_OFFSET = 15
CLUE_TERMINAL_Y_OFFSET = 5
CLUE_TERMINAL_LINE_BREAK_AMT = 37
BMP_IMG = "BMP"

BMP_IMG_ENDING = ".bmp"
Expand Down
21 changes: 18 additions & 3 deletions src/base_circuitpython/board.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,27 @@
# https://learn.adafruit.com/arduino-to-circuitpython/the-board-module


import terminal_handler


class Display:
def __init__(self):
pass
self.active_group = None
self.terminal = terminal_handler.Terminal()

def show(self, group=None):
if group != self.active_group:
self.active_group = group

if group == None:
self.terminal.draw()
return

def show(self, group):
group.draw()
# if the group has no attribute called
# "draw", then it is liable for updating itself
# when it calls show
if hasattr(group, "draw"):
group.draw()


DISPLAY = Display()
Expand Down
2 changes: 1 addition & 1 deletion src/base_circuitpython/displayio/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@
from .palette import Palette

# references to img and bmp_img are for testing purposes
from .tile_grid import TileGrid, img, bmp_img
from .tile_grid import TileGrid
75 changes: 58 additions & 17 deletions src/base_circuitpython/displayio/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
from PIL import Image
import adafruit_display_text

from .tile_grid import TileGrid, bmp_img, img
from .tile_grid import TileGrid
from . import constants as CONSTANTS

import common
import board

# Group implementation loosely based on the
# displayio.Group class in Adafruit CircuitPython
Expand All @@ -16,12 +17,17 @@


class Group:
def __init__(self, max_size, scale=1, auto_write=True):
def __init__(self, max_size, scale=1, check_active_group_ref=True, auto_write=True):
self.__check_active_group_ref = check_active_group_ref
self.__auto_write = auto_write
self.__contents = []
self.max_size = max_size
self.scale = scale
self.auto_write = auto_write
self.in_group = False
self.parent = None

@property
def in_group(self):
return self.parent != None

def append(self, item):
if len(self.__contents) == self.max_size:
Expand All @@ -32,19 +38,47 @@ def append(self, item):
raise ValueError(CONSTANTS.LAYER_ALREADY_IN_GROUP)

self.__contents.append(item)
item.in_group = True
if self.auto_write:
self.draw(show=True)
item.parent = self

self.__elem_changed()

def __elem_changed(self):
# Ensure that this group is what the board is currently showing.
# Otherwise, don't bother to draw it.
if (
self.__auto_write
and self.__check_active_group_ref
and board.DISPLAY.active_group == self
):
self.draw()

elif self.in_group:

# If a sub-group is modified, propagate to top level to
# see if one of the parents are the current active group.
self.parent.__elem_changed()

def __getitem__(self, index):
return self.__contents[index]

def __setitem__(self, index, val):
old_val = self.__contents[index]

self.__contents[index] = val

def draw(self, x=0, y=0, scale=None, show=False):
if old_val != val:
self.__elem_changed()

def draw(self, img=None, x=0, y=0, scale=None, show=True):
# this function is not a part of the orignal implementation
# it is what prints itself and its children to the frontend
# it is what draws itself and its children and potentially shows it to the
# frontend
if img == None:
img = Image.new(
"RGBA",
(CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH),
(0, 0, 0, 0),
)
if scale is None:
scale = self.scale
else:
Expand All @@ -55,11 +89,11 @@ def draw(self, x=0, y=0, scale=None, show=False):
# adafruit_display_text has some positioning considerations
# that need to be handled.

# found manually, display must be positioned upwards
# This was found manually, display must be positioned upwards
# 1 unit (1 unit * scale = scale)
y -= scale

# group is positioned against anchored_position (default (0,0)),
# Group is positioned against anchored_position (default (0,0)),
# which is positioned against anchor_point

x += self._anchor_point[0]
Expand All @@ -72,15 +106,19 @@ def draw(self, x=0, y=0, scale=None, show=False):

for elem in self.__contents:
if isinstance(elem, Group):
elem.draw(x, y, scale, False)
img = elem.draw(img=img, x=x, y=y, scale=scale, show=False,)
else:
elem.draw(x, y, scale)
img = elem.draw(img=img, x=x, y=y, scale=scale)

# show should only be true to the highest parent group
if show:
self.show()
self.show(img)

# return value only used if this is within another group
return img

def show(self):
# sends current bmp_img to the frontend
def show(self, img):
# sends current img to the frontend
buffered = BytesIO()
img.save(buffered, format="BMP")
byte_base64 = base64.b64encode(buffered.getvalue())
Expand All @@ -96,4 +134,7 @@ def __len__(self):
return len(self.__contents)

def pop(self, i=-1):
return self.__contents.pop(i)
item = self.__contents.pop(i)
item.parent = None
self.__elem_changed()
return item
10 changes: 6 additions & 4 deletions src/base_circuitpython/displayio/test/test_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from common import utils

from ..tile_grid import TileGrid, img, bmp_img
from ..tile_grid import TileGrid
from ..group import Group
from ..palette import Palette
from ..bitmap import Bitmap
Expand Down Expand Up @@ -149,20 +149,22 @@ def test_draw_group(
tg = TileGrid(bitmap=bmp_1, pixel_shader=palette, position=(0, 0))
tg2 = TileGrid(bitmap=bmp_2, pixel_shader=palette, position=(50, 50))

group_main = Group(max_size=10, scale=scale_main)
group_main = Group(max_size=10, scale=scale_main, check_active_group_ref=False)
group_sub = Group(max_size=10, scale=scale_sub)

group_sub.append(tg)
group_main.append(group_sub)
group_main.append(tg2)
# img = Image.new("RGBA", (240, 240))
img = group_main.draw()

group_main.draw(0, 0)
img.putalpha(255)
expected = Image.open(
os.path.join(self.abs_path, "img", "group_test_result.bmp")
)
expected.putalpha(255)
bmp_img_expected = expected.load()

bmp_img = img.load()
for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH):
for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH):
assert bmp_img_expected[j, i] == bmp_img[j, i]
16 changes: 12 additions & 4 deletions src/base_circuitpython/displayio/test/test_tile_grid.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pytest
from ..tile_grid import TileGrid, img, bmp_img
from PIL import Image
from ..tile_grid import TileGrid
from ..palette import Palette
from ..bitmap import Bitmap
from .. import constants as CONSTANTS
Expand Down Expand Up @@ -135,9 +136,12 @@ def test_draw(

tg = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0))
tg2 = TileGrid(bitmap=bmp, pixel_shader=palette, position=(0, 0))

img = Image.new(
"RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH)
)
# without scaling, test output
tg.draw(x_offset, y_offset, 1)
img = tg.draw(img, x_offset, y_offset, 1)
bmp_img = img.load()
for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH):
for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH):
if (i in range(y_offset + y, y_offset + y + draw_h)) and (
Expand All @@ -149,8 +153,12 @@ def test_draw(
):
assert bmp_img[j, i] == bg_color

img = Image.new(
"RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH)
)
# with scaling, test output
tg.draw(x_offset, y_offset, scale)
img = tg.draw(img, x_offset, y_offset, scale)
bmp_img = img.load()
for i in range(CONSTANTS.SCREEN_HEIGHT_WIDTH):
for j in range(CONSTANTS.SCREEN_HEIGHT_WIDTH):
if (
Expand Down
21 changes: 7 additions & 14 deletions src/base_circuitpython/displayio/tile_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,6 @@
# https://circuitpython.readthedocs.io/en/5.0.x/shared-bindings/displayio/TileGrid.html


# Create a new black (default) image
img = Image.new(
"RGBA", (CONSTANTS.SCREEN_HEIGHT_WIDTH, CONSTANTS.SCREEN_HEIGHT_WIDTH), (0, 0, 0, 0)
)

# Create the pixel map
# All displayio classes can access this
# instance to read and write to the output image.
bmp_img = img.load()


class TileGrid:
def __init__(
self,
Expand Down Expand Up @@ -56,7 +45,11 @@ def __init__(
self.bitmap = bitmap
self.pixel_shader = pixel_shader
self.default_tile = default_tile
self.in_group = False
self.parent = None

@property
def in_group(self):
return self.parent != None

# setitem for an index simply gets the index of the bitmap
# rather than the tile index
Expand All @@ -78,8 +71,7 @@ def __getitem__(self, index):

# methods that are not in the origin class:

def draw(self, x, y, scale):

def draw(self, img, x, y, scale):
# draw the current bitmap with
# appropriate scale on the global bmp_img
x = self.x * scale + x
Expand All @@ -90,6 +82,7 @@ def draw(self, x, y, scale):
)

img.paste(new_shape, (x, y), new_shape)
return img

def draw_group(self, x, y, y_start, y_end, x_start, x_end, scale):
height = y_end - y_start
Expand Down
Binary file added src/base_circuitpython/img/blinka.bmp
Binary file not shown.
Loading

0 comments on commit 9d569da

Please sign in to comment.