From b8ae5c3845655e17b01a21eef732a1f24974d7d2 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 15 Oct 2024 15:44:44 -0500 Subject: [PATCH 1/2] add pyportal versions. move helper class from shared to each version dir --- .../anchored_tilegrid.py | 1 - .../code.py | 30 +- .../spirit_board.py | 389 +++++++++++++++++- TFT_Spirit_Board/pyportal/code.py | 102 +++++ .../pyportal/planchette_v1_sm.bmp | Bin 0 -> 1830 bytes .../{shared => pyportal}/spirit_board.py | 33 +- .../pyportal/spirit_board_320x240.bmp | Bin 0 -> 77930 bytes TFT_Spirit_Board/pyportal_titano/code.py | 102 +++++ .../pyportal_titano/planchette_v1.bmp | Bin 0 -> 3462 bytes .../pyportal_titano/spirit_board.py | 388 +++++++++++++++++ .../pyportal_titano/spirit_board_480x320.bmp | Bin 0 -> 154758 bytes TFT_Spirit_Board/shared/anchored_tilegrid.py | 63 --- 12 files changed, 1026 insertions(+), 82 deletions(-) delete mode 120000 TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/anchored_tilegrid.py mode change 120000 => 100644 TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py create mode 100644 TFT_Spirit_Board/pyportal/code.py create mode 100644 TFT_Spirit_Board/pyportal/planchette_v1_sm.bmp rename TFT_Spirit_Board/{shared => pyportal}/spirit_board.py (90%) create mode 100644 TFT_Spirit_Board/pyportal/spirit_board_320x240.bmp create mode 100644 TFT_Spirit_Board/pyportal_titano/code.py create mode 100644 TFT_Spirit_Board/pyportal_titano/planchette_v1.bmp create mode 100644 TFT_Spirit_Board/pyportal_titano/spirit_board.py create mode 100644 TFT_Spirit_Board/pyportal_titano/spirit_board_480x320.bmp delete mode 100644 TFT_Spirit_Board/shared/anchored_tilegrid.py diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/anchored_tilegrid.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/anchored_tilegrid.py deleted file mode 120000 index 138e4f880..000000000 --- a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/anchored_tilegrid.py +++ /dev/null @@ -1 +0,0 @@ -../shared/anchored_tilegrid.py \ No newline at end of file diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py index b2fccb9ab..dc5c778cd 100644 --- a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py +++ b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py @@ -42,19 +42,23 @@ i2c = board.I2C() tsc = adafruit_tsc2007.TSC2007(i2c, irq=None) -# Initialize a requests session -pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) -ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) -requests = adafruit_requests.Session(pool, ssl_context) - -# Set your Adafruit IO Username and Key in secrets.py -# (visit io.adafruit.com if you need to create an account, -# or if you need your Adafruit IO key.) -aio_username = os.getenv("AIO_USERNAME") -aio_key = os.getenv("AIO_KEY") - -# Initialize an Adafruit IO HTTP API object -io = IO_HTTP(aio_username, aio_key, requests) +try: + # Initialize a requests session + pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) + ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) + requests = adafruit_requests.Session(pool, ssl_context) + + # Set your Adafruit IO Username and Key in secrets.py + # (visit io.adafruit.com if you need to create an account, + # or if you need your Adafruit IO key.) + aio_username = os.getenv("AIO_USERNAME") + aio_key = os.getenv("AIO_KEY") + + # Initialize an Adafruit IO HTTP API object + io = IO_HTTP(aio_username, aio_key, requests) +except (RuntimeError, TypeError) as e: + print("could not connect to AP or AdafruitIO: ", e) + io = None # initialize the SpiritBoard class spirit_board = SpiritBoard(display) diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py deleted file mode 120000 index a41e6a6d5..000000000 --- a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py +++ /dev/null @@ -1 +0,0 @@ -../shared/spirit_board.py \ No newline at end of file diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py new file mode 100644 index 000000000..6d0feecab --- /dev/null +++ b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py @@ -0,0 +1,388 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard helper class +""" +import math +import os +import random +import time +import displayio + +# pylint: disable=import-error +from adafruit_anchored_tilegrid import AnchoredTileGrid + + +class SpiritBoard(displayio.Group): + """ + DisplayIO Based SpiritBoard + + Holds and manages everything needed to draw the spirit board and planchette, as well + as move the planchette around to output messages from the spirits. + """ + # Mapping of letters and words on the board to their pixel coordinates. + # Points are centered on the target letter. + # Words can contain a list of points, the planchette will move between them. + LOCATIONS = {"a": (42, 145), "b": (63, 115), "c": (97, 97), "d": (133, 85), + "e": (172, 78), "f": (207, 75), "g": (245, 74), "h": (284, 75), + "i": (319, 80), "j": (345, 85), "k": (375, 95), "l": (410, 111), + "m": (435, 140), "n": (78, 190), "o": (96, 162), "p": (122, 145), + "q": (149, 132), "r": (179, 123), "s": (208, 118), "t": (235, 116), + "u": (267, 116), "v": (302, 119), "w": (334, 130), "x": (368, 147), + "y": (393, 168), "z": (405, 194), + " ": (151, 201), "<3": (247, 20), "?": (162, 18), "&": (339, 18), + "home": (234, 246), "yes": [(26, 20), (82, 20)], "no": [(418, 20), (450, 20)], + "hello": [(20, 300), (123, 300)], "goodbye": [(314, 300), (456, 300)]} + + # List of full words on the board (multi-character strings) + # used to know whether to parse the message + # one letter at a time, or with a full word. + FULL_WORDS = ["yes", "no", "hello", "goodbye", "home", "<3"] + + def __init__(self, display): + """ + Create a SpiritBoard instance and put it in the displays root_group to make it visible. + + :param displayio.Display display: Display object to show the spirit board on. + """ + self._display = display + super().__init__() + + # board image file + if display.width == 480 and display.height == 320: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + elif display.width == 320 and display.height == 240: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_320x240.bmp") + self._convert_locations_for_small_screen() + self.spirit_board_tilegrid = displayio.TileGrid( + bitmap=self.spirit_board_odb, pixel_shader=self.spirit_board_odb.pixel_shader) + + self.append(self.spirit_board_tilegrid) + + # planchette image file + if display.width == 480 and display.height == 320: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + elif display.width == 320 and display.height == 240: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1_sm.bmp") + + self.planchette_odb.pixel_shader.make_transparent(0) + self.planchette_tilegrid = AnchoredTileGrid( + bitmap=self.planchette_odb, pixel_shader=self.planchette_odb.pixel_shader) + + # AnchoredTileGrid is used so that we can move the planchette + # relative to the cetner of the window. + self.planchette_tilegrid.anchor_point = (0.5, 0.5) + + # move the planchette to it's home to start + self.planchette_tilegrid.anchored_position = SpiritBoard.LOCATIONS['home'] + + # append the planchette to the self Group instance + self.append(self.planchette_tilegrid) + + # set the self Group instance to root_group, so it's shown on the display. + display.root_group = self + + def _convert_locations_for_small_screen(self): + _x_ratio = 320/480 + _y_ratio = 240/320 + # 46x + print(_x_ratio, _y_ratio) + for loc_key in self.LOCATIONS.keys(): + if isinstance(self.LOCATIONS[loc_key], tuple): + _x, _y = self.LOCATIONS[loc_key] + self.LOCATIONS[loc_key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(self.LOCATIONS[loc_key], list): + for i in range(len(self.LOCATIONS[loc_key])): + _x, _y = self.LOCATIONS[loc_key][i] + self.LOCATIONS[loc_key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + + + @staticmethod + def dist(point_a, point_b): + """ + Calculate the distance between two points. + + :param tuple point_a: x,y pair of the first point + :param point_b: x,y pair of the second point + :return: the distance between the two points + """ + return math.sqrt((point_b[0] - point_a[0]) ** 2 + (point_b[1] - point_a[1]) ** 2) + + def slide_planchette(self, target_location, delay=0.1, step_size=4): + """ + Slide the planchette to the target location. + + delay and step_size parameters can be used to control the speed of the sliding. + + If the planchette is already at the target_location it will jump up slightly and + then return to the target location. This helps to clarify messages that contain + consecutive matching letters. + + :param tuple target_location: x,y pair of the target location + :param float delay: length of time to sleep inbetween each movement step + :param int step_size: how big of a step to take with each movement. + :return: None + """ + # disable auto_refresh during sliding, we refresh manually for each step + self._display.auto_refresh = False + + # current location + current_location = self.planchette_tilegrid.anchored_position + + # get the distance between the two + distance = SpiritBoard.dist(current_location, target_location) + + # if the planchette is already at the target location + if distance == 0: + # cannot slide to the location we're already at. + # slide up a tiny bit and then back to where we were. + self.slide_planchette((current_location[0], current_location[1] - 20), delay, step_size) + + # update the current location to where we moved to + current_location = self.planchette_tilegrid.anchored_position + + distance = SpiritBoard.dist(current_location, target_location) + + # variables used to calculate where the next point + # between where we are at and where we are going is. + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + # print(current_location) + # print(next_point) + + # update the anchored_position of the planchette to move it to + # the next point. + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # while we haven't made it to the target location + while 0 < distance_ratio < 1: + # update current location variable + current_location = self.planchette_tilegrid.anchored_position + + # calculate distance between new current location and target location + distance = SpiritBoard.dist(current_location, target_location) + + # if we have arrived at the target location + if distance == 0: + # break out of the function + break + + # distance ratio variables used to calculate next point + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + + # if we have not arrived at the target location yet + if 0 < distance_ratio < 1: + + # update the anchored position to move the planchette to the + # next point + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # update the anchored position to move the planchette to the + # target_location. This is needed in-case we undershot + # the target location due to a step size that does not + # divide into the total distance evenly. + self.planchette_tilegrid.anchored_position = target_location + + # refresh the display + self._display.refresh() + + # re-enable auto_refresh in case any other parts of the program + # want to update the display + self._display.auto_refresh = True + + def write_message(self, message, skip_spaces=True, step_size=6): + """ + + :param string message: The message to output with the planchette + :param skip_spaces: Whether to skip space characters + :param step_size: How big of a step to take with each movement + :return: None + """ + # ignore empty messages + if message == "": + return + + # split the message on space to get a list of words + message_words = message.split(" ") + + # loop over the words in the message + for index, word in enumerate(message_words): + print(f"index: {index}, word: {word}") + + # if the current word is one of the full words on the board + if word in SpiritBoard.FULL_WORDS: + + # if the word on the board has multiple points + if isinstance(SpiritBoard.LOCATIONS[word], list): + # loop over the points for the word + for location in SpiritBoard.LOCATIONS[word]: + print(f"sliding to: {location}") + # slide the planchette to each point + self.slide_planchette(location, delay=0.02, step_size=step_size) + + # pause at each point + time.sleep(0.25) + + # if the word has only a single point + elif isinstance(SpiritBoard.LOCATIONS[word], tuple): + # slide the planchette to the point + self.slide_planchette(SpiritBoard.LOCATIONS[word], + delay=0.02, step_size=step_size) + + # pause at the point + time.sleep(0.5) + + else: # the current word is not one of the full words + # go one character at a time + + # loop over each character in the word + for character in word: + # slide the planchette to the current characters location + self.slide_planchette(SpiritBoard.LOCATIONS[character], + delay=0.02, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # if we are not skipping spaces, and we are not done with the message + if not skip_spaces and index < len(message_words) - 1: + # handle the space + # slide the planchette to the empty space location. + self.slide_planchette(SpiritBoard.LOCATIONS[" "], + delay=0.02, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # after we've shown the whole message + # slide the planchette back to it's home location + self.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=0.02, step_size=6) + + @staticmethod + def sync_with_io(io) -> list: + """ + Fetch messages from AdafruitIO and store them in the context variable. + + You must create the "SpiritBoard" feed object inside AdafruitIO for + this to succeed. + + Will raise an exception if connecting or fetching failed. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + if io is None: + raise RuntimeError("No connection to AdafruitIO") + + # fetch the latest data in the feed + incoming_message = io.receive_data("spiritboard") + + # if it's multiple messages seperated by commas + if "," in incoming_message["value"]: + # split on the commas to seperate the messages + # and put them in context + messages = incoming_message["value"].split(",") + + else: # it's only a single message + # set the single message into the context + messages = [incoming_message["value"]] + + # print if successful + if len(messages) > 0: + print("io fetch success") + + return messages + + + @staticmethod + def read_local_messages_file(shuffle=False) -> list: + """ + Read messages from the local spirit_messages.txt file on the CIRCUITPY drive. + Each message should be on its own line within that file. + + :param boolean shuffle: Whether to shuffle the messages. Default is False + which will keep them in the same order they appear in the file. + + :return: List of messages + """ + + # if the spirit_messages.txt file exists + if "spirit_messages.txt" in os.listdir("/"): + # open the file + with open("/spirit_messages.txt", "r", encoding="utf-8") as f: + # split on newline and set the messages found into the context + messages = f.read().split("\n") + + # if there are no messages + if len(messages) == 0: + # raise an error and tell the user to set some up + raise RuntimeError("Connection to adafruit.io failed, and there were " + "no messages in spirit_messages.txt. Enter your WIFI " + "credentials, aio username, and token in settings.toml, or add " + "messages to spirit_messages.txt.") + + # if there are messages and we need to shuffle them + if shuffle: + # temporary list to hold them + shuffled_list = [] + + # while there are still messages in the context messages list + while len(messages) > 0: + # pop a randomly chosen message from the context and + # put it into the temporary list + shuffled_list.append(messages.pop( + random.randint(0, len(messages) - 1))) + + # update the context list to the shuffled one + messages = shuffled_list + + return messages + + @staticmethod + def get_messages(io) -> list: + """ + Higher level get messages function. It will first attempt to + fetch the messages from Adafruit IO. If that doesn't work, + it will read them from the local spirit_messages.txt file. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + try: + return SpiritBoard.sync_with_io(io) + except (OSError, RuntimeError): + print("Caught OSError. Will try again next time.\n" + "Falling back to spirit_messages.txt file.") + return SpiritBoard.read_local_messages_file() diff --git a/TFT_Spirit_Board/pyportal/code.py b/TFT_Spirit_Board/pyportal/code.py new file mode 100644 index 000000000..8551f99ba --- /dev/null +++ b/TFT_Spirit_Board/pyportal/code.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard code.py +Standard PyPortal w/ 320x240 pixel display + +Receive and display messages from the spirits. +""" +# pylint: disable=import-error, invalid-name + +import os +import board +from digitalio import DigitalInOut +import adafruit_connection_manager +from adafruit_esp32spi import adafruit_esp32spi +import adafruit_touchscreen +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError + +from spirit_board import SpiritBoard + +display = board.DISPLAY + +# Initialize the touch overlay +touchscreen = adafruit_touchscreen.Touchscreen( + board.TOUCH_XL, + board.TOUCH_XR, + board.TOUCH_YD, + board.TOUCH_YU, + calibration=((6584, 59861), (9505, 57492)), + size=(board.DISPLAY.width, board.DISPLAY.height), +) + +# Initialize the ES32SPI Coprocessor +esp32_cs = DigitalInOut(board.ESP_CS) +esp32_ready = DigitalInOut(board.ESP_BUSY) +esp32_reset = DigitalInOut(board.ESP_RESET) +spi = board.SPI() +esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) + +# connect to wifi network defined in settings.toml +print("Connecting to AP...") + +try: + esp.connect_AP(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) + + # Initialize a requests session + pool = adafruit_connection_manager.get_radio_socketpool(esp) + ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) + requests = adafruit_requests.Session(pool, ssl_context) + + # Set your Adafruit IO Username and Key in secrets.py + # (visit io.adafruit.com if you need to create an account, + # or if you need your Adafruit IO key.) + aio_username = os.getenv("AIO_USERNAME") + aio_key = os.getenv("AIO_KEY") + + # Initialize an Adafruit IO HTTP API object + io = IO_HTTP(aio_username, aio_key, requests) +except (RuntimeError, TypeError) as e: + print("could not connect to AP or AdafruitIO: ", e) + io = None + +# initialize the SpiritBoard class +spirit_board = SpiritBoard(display) + +# get messages from io or the local file +messages = spirit_board.get_messages(io) + +# The planchette is already at the home position. +# Slide it to home again to make it jump, in order +# indicate the message is ready to be received. +spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=0.02, step_size=6) + +# current message index +message_index = 0 +while True: + # read the touch screen + p = touchscreen.touch_point + + # if the display was touched + if p: + # write the message at the current index + spirit_board.write_message(messages[message_index], step_size=8) + + # if there are more messages in the list inside of context + if message_index < len(messages) - 1: + # increment the message index + message_index += 1 + + else: # there are no more messages in the list + # reset the index to 0 + message_index = 0 + print("fetching next") + + # fetch new messages + messages = spirit_board.get_messages(io) + + # make the planchette jump to indicate messages are ready to display + spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], + delay=0.02, step_size=6) diff --git a/TFT_Spirit_Board/pyportal/planchette_v1_sm.bmp b/TFT_Spirit_Board/pyportal/planchette_v1_sm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c9c5db9649056eb79fd40aa2a7faa557c8b6ee81 GIT binary patch literal 1830 zcmbtTF;c@Y5R`#|ib<3o*vzEl5iX#j$rEUJ04@-C$1X^ERaifPAj8=abS;{Ir{&Pw!e>FkP*<_usqpnoemq zzv(3Bym!igb+ECF1Hy5T4-qNnQDqfs6hZGtZ^WmuTByNIUq$Y12tD3 zreG^Vlk#4IhZ7|%>2s+SePFnOQbTW~H74oDrt2;7t;{p_r}o{U3bgi zqDZrG?Ronb8M`yYFp4w19Ce|?Jle;!;I)i|jNi)W*2!fnBS*y7bkzuHm+vex14Ht) sj0yEJa@6+Ch4iKOG7{?CFsA8dxZ!_3OGiL&USY$ztUPH;Dem8=Ut{55asU7T literal 0 HcmV?d00001 diff --git a/TFT_Spirit_Board/shared/spirit_board.py b/TFT_Spirit_Board/pyportal/spirit_board.py similarity index 90% rename from TFT_Spirit_Board/shared/spirit_board.py rename to TFT_Spirit_Board/pyportal/spirit_board.py index 9211d03de..6d0feecab 100644 --- a/TFT_Spirit_Board/shared/spirit_board.py +++ b/TFT_Spirit_Board/pyportal/spirit_board.py @@ -11,7 +11,7 @@ import displayio # pylint: disable=import-error -from anchored_tilegrid import AnchoredTileGrid +from adafruit_anchored_tilegrid import AnchoredTileGrid class SpiritBoard(displayio.Group): @@ -50,14 +50,22 @@ def __init__(self, display): super().__init__() # board image file - self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + if display.width == 480 and display.height == 320: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + elif display.width == 320 and display.height == 240: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_320x240.bmp") + self._convert_locations_for_small_screen() self.spirit_board_tilegrid = displayio.TileGrid( bitmap=self.spirit_board_odb, pixel_shader=self.spirit_board_odb.pixel_shader) self.append(self.spirit_board_tilegrid) # planchette image file - self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + if display.width == 480 and display.height == 320: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + elif display.width == 320 and display.height == 240: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1_sm.bmp") + self.planchette_odb.pixel_shader.make_transparent(0) self.planchette_tilegrid = AnchoredTileGrid( bitmap=self.planchette_odb, pixel_shader=self.planchette_odb.pixel_shader) @@ -75,6 +83,21 @@ def __init__(self, display): # set the self Group instance to root_group, so it's shown on the display. display.root_group = self + def _convert_locations_for_small_screen(self): + _x_ratio = 320/480 + _y_ratio = 240/320 + # 46x + print(_x_ratio, _y_ratio) + for loc_key in self.LOCATIONS.keys(): + if isinstance(self.LOCATIONS[loc_key], tuple): + _x, _y = self.LOCATIONS[loc_key] + self.LOCATIONS[loc_key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(self.LOCATIONS[loc_key], list): + for i in range(len(self.LOCATIONS[loc_key])): + _x, _y = self.LOCATIONS[loc_key][i] + self.LOCATIONS[loc_key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + + @staticmethod def dist(point_a, point_b): """ @@ -279,6 +302,8 @@ def sync_with_io(io) -> list: :return: List of messages """ + if io is None: + raise RuntimeError("No connection to AdafruitIO") # fetch the latest data in the feed incoming_message = io.receive_data("spiritboard") @@ -357,7 +382,7 @@ def get_messages(io) -> list: """ try: return SpiritBoard.sync_with_io(io) - except OSError: + except (OSError, RuntimeError): print("Caught OSError. Will try again next time.\n" "Falling back to spirit_messages.txt file.") return SpiritBoard.read_local_messages_file() diff --git a/TFT_Spirit_Board/pyportal/spirit_board_320x240.bmp b/TFT_Spirit_Board/pyportal/spirit_board_320x240.bmp new file mode 100644 index 0000000000000000000000000000000000000000..37f8d3b4d5ade88ab7484deef3bbf70979be1c74 GIT binary patch literal 77930 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 literal 0 HcmV?d00001 diff --git a/TFT_Spirit_Board/pyportal_titano/code.py b/TFT_Spirit_Board/pyportal_titano/code.py new file mode 100644 index 000000000..e2b0ae98a --- /dev/null +++ b/TFT_Spirit_Board/pyportal_titano/code.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard code.py +PyPortal w/ 480x320 pixel display + +Receive and display messages from the spirits. +""" +# pylint: disable=import-error, invalid-name + +import os +import board +from digitalio import DigitalInOut +import adafruit_connection_manager +from adafruit_esp32spi import adafruit_esp32spi +import adafruit_touchscreen +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError + +from spirit_board import SpiritBoard + +display = board.DISPLAY + +# Initialize the touch overlay +touchscreen = adafruit_touchscreen.Touchscreen( + board.TOUCH_XL, + board.TOUCH_XR, + board.TOUCH_YD, + board.TOUCH_YU, + calibration=((6584, 59861), (9505, 57492)), + size=(board.DISPLAY.width, board.DISPLAY.height), +) + +# Initialize the ES32SPI Coprocessor +esp32_cs = DigitalInOut(board.ESP_CS) +esp32_ready = DigitalInOut(board.ESP_BUSY) +esp32_reset = DigitalInOut(board.ESP_RESET) +spi = board.SPI() +esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) + +# connect to wifi network defined in settings.toml +print("Connecting to AP...") + +try: + esp.connect_AP(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) + + # Initialize a requests session + pool = adafruit_connection_manager.get_radio_socketpool(esp) + ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) + requests = adafruit_requests.Session(pool, ssl_context) + + # Set your Adafruit IO Username and Key in secrets.py + # (visit io.adafruit.com if you need to create an account, + # or if you need your Adafruit IO key.) + aio_username = os.getenv("AIO_USERNAME") + aio_key = os.getenv("AIO_KEY") + + # Initialize an Adafruit IO HTTP API object + io = IO_HTTP(aio_username, aio_key, requests) +except (RuntimeError, TypeError) as e: + print("could not connect to AP or AdafruitIO: ", e) + io = None + +# initialize the SpiritBoard class +spirit_board = SpiritBoard(display) + +# get messages from io or the local file +messages = spirit_board.get_messages(io) + +# The planchette is already at the home position. +# Slide it to home again to make it jump, in order +# indicate the message is ready to be received. +spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=0.02, step_size=6) + +# current message index +message_index = 0 +while True: + # read the touch screen + p = touchscreen.touch_point + + # if the display was touched + if p: + # write the message at the current index + spirit_board.write_message(messages[message_index], step_size=8) + + # if there are more messages in the list inside of context + if message_index < len(messages) - 1: + # increment the message index + message_index += 1 + + else: # there are no more messages in the list + # reset the index to 0 + message_index = 0 + print("fetching next") + + # fetch new messages + messages = spirit_board.get_messages(io) + + # make the planchette jump to indicate messages are ready to display + spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], + delay=0.02, step_size=6) diff --git a/TFT_Spirit_Board/pyportal_titano/planchette_v1.bmp b/TFT_Spirit_Board/pyportal_titano/planchette_v1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b36ff9c82e9987f086dce61f2c55a2fdc51de0d0 GIT binary patch literal 3462 zcmbtVF_P3U5R`$Ct7G|rmz+mza6}{*6Or%$QevLK%XkPsfa&RJ&B&Hrb*$^wmRdbM zJtNC^`~35v`Sr{0KkWBpzc2P%+8evK_UCPDA3pN;+UEGR_E&#CyM228?t>THUTwG! zzaQJz_S_zC-(uy0>s_HOj_d$KJLZfUW-;%tb|uM10M^td;26^_jPWo^FCK$93v{Sc zOq)>!Ayk4Qsv?AH5TgbJ&=3?+?nJlMI9{ZHt6B6YpjW5+er`r4T1E=OD9P%I2(sMJ{uy_k#r)Thby;-};LFEcecv@@J{>qgcZCSaJqbbLW@g^SU zV&7o@E>0AT5)XA^0jBTb#2%rrLmigoJAV(S@1qsg$FiXdZ&o@?QhZi>NTftEkjjUClPXShCxJiK04cA-mvr07#79Ewcy8THgeEc} zl$JMzvovqf>LhQLdd1b?U_Ux%nyMz7JBAdu(USSz)f8pSMdwTkCs9I3RYJ$1zeT61 z=z86~Zley8fpbte$;e}WhmOH=*JqAFf|>JF>h)}^pumf+H9L5k>r=-FTP~-CQ~5G| XxyGz{5J$YumgDVA+Iiv0`;XB-Pn)(0 literal 0 HcmV?d00001 diff --git a/TFT_Spirit_Board/pyportal_titano/spirit_board.py b/TFT_Spirit_Board/pyportal_titano/spirit_board.py new file mode 100644 index 000000000..6d0feecab --- /dev/null +++ b/TFT_Spirit_Board/pyportal_titano/spirit_board.py @@ -0,0 +1,388 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard helper class +""" +import math +import os +import random +import time +import displayio + +# pylint: disable=import-error +from adafruit_anchored_tilegrid import AnchoredTileGrid + + +class SpiritBoard(displayio.Group): + """ + DisplayIO Based SpiritBoard + + Holds and manages everything needed to draw the spirit board and planchette, as well + as move the planchette around to output messages from the spirits. + """ + # Mapping of letters and words on the board to their pixel coordinates. + # Points are centered on the target letter. + # Words can contain a list of points, the planchette will move between them. + LOCATIONS = {"a": (42, 145), "b": (63, 115), "c": (97, 97), "d": (133, 85), + "e": (172, 78), "f": (207, 75), "g": (245, 74), "h": (284, 75), + "i": (319, 80), "j": (345, 85), "k": (375, 95), "l": (410, 111), + "m": (435, 140), "n": (78, 190), "o": (96, 162), "p": (122, 145), + "q": (149, 132), "r": (179, 123), "s": (208, 118), "t": (235, 116), + "u": (267, 116), "v": (302, 119), "w": (334, 130), "x": (368, 147), + "y": (393, 168), "z": (405, 194), + " ": (151, 201), "<3": (247, 20), "?": (162, 18), "&": (339, 18), + "home": (234, 246), "yes": [(26, 20), (82, 20)], "no": [(418, 20), (450, 20)], + "hello": [(20, 300), (123, 300)], "goodbye": [(314, 300), (456, 300)]} + + # List of full words on the board (multi-character strings) + # used to know whether to parse the message + # one letter at a time, or with a full word. + FULL_WORDS = ["yes", "no", "hello", "goodbye", "home", "<3"] + + def __init__(self, display): + """ + Create a SpiritBoard instance and put it in the displays root_group to make it visible. + + :param displayio.Display display: Display object to show the spirit board on. + """ + self._display = display + super().__init__() + + # board image file + if display.width == 480 and display.height == 320: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + elif display.width == 320 and display.height == 240: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_320x240.bmp") + self._convert_locations_for_small_screen() + self.spirit_board_tilegrid = displayio.TileGrid( + bitmap=self.spirit_board_odb, pixel_shader=self.spirit_board_odb.pixel_shader) + + self.append(self.spirit_board_tilegrid) + + # planchette image file + if display.width == 480 and display.height == 320: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + elif display.width == 320 and display.height == 240: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1_sm.bmp") + + self.planchette_odb.pixel_shader.make_transparent(0) + self.planchette_tilegrid = AnchoredTileGrid( + bitmap=self.planchette_odb, pixel_shader=self.planchette_odb.pixel_shader) + + # AnchoredTileGrid is used so that we can move the planchette + # relative to the cetner of the window. + self.planchette_tilegrid.anchor_point = (0.5, 0.5) + + # move the planchette to it's home to start + self.planchette_tilegrid.anchored_position = SpiritBoard.LOCATIONS['home'] + + # append the planchette to the self Group instance + self.append(self.planchette_tilegrid) + + # set the self Group instance to root_group, so it's shown on the display. + display.root_group = self + + def _convert_locations_for_small_screen(self): + _x_ratio = 320/480 + _y_ratio = 240/320 + # 46x + print(_x_ratio, _y_ratio) + for loc_key in self.LOCATIONS.keys(): + if isinstance(self.LOCATIONS[loc_key], tuple): + _x, _y = self.LOCATIONS[loc_key] + self.LOCATIONS[loc_key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(self.LOCATIONS[loc_key], list): + for i in range(len(self.LOCATIONS[loc_key])): + _x, _y = self.LOCATIONS[loc_key][i] + self.LOCATIONS[loc_key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + + + @staticmethod + def dist(point_a, point_b): + """ + Calculate the distance between two points. + + :param tuple point_a: x,y pair of the first point + :param point_b: x,y pair of the second point + :return: the distance between the two points + """ + return math.sqrt((point_b[0] - point_a[0]) ** 2 + (point_b[1] - point_a[1]) ** 2) + + def slide_planchette(self, target_location, delay=0.1, step_size=4): + """ + Slide the planchette to the target location. + + delay and step_size parameters can be used to control the speed of the sliding. + + If the planchette is already at the target_location it will jump up slightly and + then return to the target location. This helps to clarify messages that contain + consecutive matching letters. + + :param tuple target_location: x,y pair of the target location + :param float delay: length of time to sleep inbetween each movement step + :param int step_size: how big of a step to take with each movement. + :return: None + """ + # disable auto_refresh during sliding, we refresh manually for each step + self._display.auto_refresh = False + + # current location + current_location = self.planchette_tilegrid.anchored_position + + # get the distance between the two + distance = SpiritBoard.dist(current_location, target_location) + + # if the planchette is already at the target location + if distance == 0: + # cannot slide to the location we're already at. + # slide up a tiny bit and then back to where we were. + self.slide_planchette((current_location[0], current_location[1] - 20), delay, step_size) + + # update the current location to where we moved to + current_location = self.planchette_tilegrid.anchored_position + + distance = SpiritBoard.dist(current_location, target_location) + + # variables used to calculate where the next point + # between where we are at and where we are going is. + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + # print(current_location) + # print(next_point) + + # update the anchored_position of the planchette to move it to + # the next point. + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # while we haven't made it to the target location + while 0 < distance_ratio < 1: + # update current location variable + current_location = self.planchette_tilegrid.anchored_position + + # calculate distance between new current location and target location + distance = SpiritBoard.dist(current_location, target_location) + + # if we have arrived at the target location + if distance == 0: + # break out of the function + break + + # distance ratio variables used to calculate next point + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + + # if we have not arrived at the target location yet + if 0 < distance_ratio < 1: + + # update the anchored position to move the planchette to the + # next point + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # update the anchored position to move the planchette to the + # target_location. This is needed in-case we undershot + # the target location due to a step size that does not + # divide into the total distance evenly. + self.planchette_tilegrid.anchored_position = target_location + + # refresh the display + self._display.refresh() + + # re-enable auto_refresh in case any other parts of the program + # want to update the display + self._display.auto_refresh = True + + def write_message(self, message, skip_spaces=True, step_size=6): + """ + + :param string message: The message to output with the planchette + :param skip_spaces: Whether to skip space characters + :param step_size: How big of a step to take with each movement + :return: None + """ + # ignore empty messages + if message == "": + return + + # split the message on space to get a list of words + message_words = message.split(" ") + + # loop over the words in the message + for index, word in enumerate(message_words): + print(f"index: {index}, word: {word}") + + # if the current word is one of the full words on the board + if word in SpiritBoard.FULL_WORDS: + + # if the word on the board has multiple points + if isinstance(SpiritBoard.LOCATIONS[word], list): + # loop over the points for the word + for location in SpiritBoard.LOCATIONS[word]: + print(f"sliding to: {location}") + # slide the planchette to each point + self.slide_planchette(location, delay=0.02, step_size=step_size) + + # pause at each point + time.sleep(0.25) + + # if the word has only a single point + elif isinstance(SpiritBoard.LOCATIONS[word], tuple): + # slide the planchette to the point + self.slide_planchette(SpiritBoard.LOCATIONS[word], + delay=0.02, step_size=step_size) + + # pause at the point + time.sleep(0.5) + + else: # the current word is not one of the full words + # go one character at a time + + # loop over each character in the word + for character in word: + # slide the planchette to the current characters location + self.slide_planchette(SpiritBoard.LOCATIONS[character], + delay=0.02, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # if we are not skipping spaces, and we are not done with the message + if not skip_spaces and index < len(message_words) - 1: + # handle the space + # slide the planchette to the empty space location. + self.slide_planchette(SpiritBoard.LOCATIONS[" "], + delay=0.02, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # after we've shown the whole message + # slide the planchette back to it's home location + self.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=0.02, step_size=6) + + @staticmethod + def sync_with_io(io) -> list: + """ + Fetch messages from AdafruitIO and store them in the context variable. + + You must create the "SpiritBoard" feed object inside AdafruitIO for + this to succeed. + + Will raise an exception if connecting or fetching failed. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + if io is None: + raise RuntimeError("No connection to AdafruitIO") + + # fetch the latest data in the feed + incoming_message = io.receive_data("spiritboard") + + # if it's multiple messages seperated by commas + if "," in incoming_message["value"]: + # split on the commas to seperate the messages + # and put them in context + messages = incoming_message["value"].split(",") + + else: # it's only a single message + # set the single message into the context + messages = [incoming_message["value"]] + + # print if successful + if len(messages) > 0: + print("io fetch success") + + return messages + + + @staticmethod + def read_local_messages_file(shuffle=False) -> list: + """ + Read messages from the local spirit_messages.txt file on the CIRCUITPY drive. + Each message should be on its own line within that file. + + :param boolean shuffle: Whether to shuffle the messages. Default is False + which will keep them in the same order they appear in the file. + + :return: List of messages + """ + + # if the spirit_messages.txt file exists + if "spirit_messages.txt" in os.listdir("/"): + # open the file + with open("/spirit_messages.txt", "r", encoding="utf-8") as f: + # split on newline and set the messages found into the context + messages = f.read().split("\n") + + # if there are no messages + if len(messages) == 0: + # raise an error and tell the user to set some up + raise RuntimeError("Connection to adafruit.io failed, and there were " + "no messages in spirit_messages.txt. Enter your WIFI " + "credentials, aio username, and token in settings.toml, or add " + "messages to spirit_messages.txt.") + + # if there are messages and we need to shuffle them + if shuffle: + # temporary list to hold them + shuffled_list = [] + + # while there are still messages in the context messages list + while len(messages) > 0: + # pop a randomly chosen message from the context and + # put it into the temporary list + shuffled_list.append(messages.pop( + random.randint(0, len(messages) - 1))) + + # update the context list to the shuffled one + messages = shuffled_list + + return messages + + @staticmethod + def get_messages(io) -> list: + """ + Higher level get messages function. It will first attempt to + fetch the messages from Adafruit IO. If that doesn't work, + it will read them from the local spirit_messages.txt file. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + try: + return SpiritBoard.sync_with_io(io) + except (OSError, RuntimeError): + print("Caught OSError. Will try again next time.\n" + "Falling back to spirit_messages.txt file.") + return SpiritBoard.read_local_messages_file() diff --git a/TFT_Spirit_Board/pyportal_titano/spirit_board_480x320.bmp b/TFT_Spirit_Board/pyportal_titano/spirit_board_480x320.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1848c95065a069cf4084273a92e464fc921941c9 GIT binary patch literal 154758 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

lYbQNo{_#Kg|# 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 literal 0 HcmV?d00001 diff --git a/TFT_Spirit_Board/shared/anchored_tilegrid.py b/TFT_Spirit_Board/shared/anchored_tilegrid.py deleted file mode 100644 index 908386464..000000000 --- a/TFT_Spirit_Board/shared/anchored_tilegrid.py +++ /dev/null @@ -1,63 +0,0 @@ -# SPDX-FileCopyrightText: 2024 Tim Cocks -# -# SPDX-License-Identifier: MIT -""" -AnchoredTilegrid helper class -""" -try: - from typing import Tuple -except ImportError: - pass - -from displayio import TileGrid - - -class AnchoredTileGrid(TileGrid): - """ - AnchoredTileGrid extends TileGrid and allows placing the TileGrid - relative to an arbitrary anchor point. - """ - def __init__(self, bitmap, **kwargs): - super().__init__(bitmap, **kwargs) - self._anchor_point = (0, 0) - - self._anchored_position = ( - 0 if "x" not in kwargs else kwargs["x"], - 0 if "y" not in kwargs else kwargs["y"] - ) - - @property - def anchor_point(self): - """ - The anchor point. tuple containing x and y values ranging - from 0 to 1. - """ - return self._anchor_point - - @anchor_point.setter - def anchor_point(self, new_anchor_point: Tuple[float, float]) -> None: - self._anchor_point = new_anchor_point - # update the anchored_position using setter - self.anchored_position = self._anchored_position - - @property - def anchored_position(self) -> Tuple[int, int]: - """Position relative to the anchor_point. Tuple containing x,y - pixel coordinates.""" - return self._anchored_position - - @anchored_position.setter - def anchored_position(self, new_position: Tuple[int, int]) -> None: - self._anchored_position = new_position - - if (self._anchor_point is not None) and (self._anchored_position is not None): - # Calculate (x,y) position - self.x = int( - new_position[0] - - round(self._anchor_point[0] * (self.tile_width * self.width)) - ) - - self.y = int( - new_position[1] - - round(self._anchor_point[1] * (self.tile_height * self.height)) - ) From ebf338ddc7ef76ebeab21e8b4ed922d0a434dba0 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 15 Oct 2024 16:01:55 -0500 Subject: [PATCH 2/2] pylint fixes --- .../spirit_board.py | 16 ++++++++-------- TFT_Spirit_Board/pyportal/code.py | 2 +- TFT_Spirit_Board/pyportal/spirit_board.py | 16 ++++++++-------- TFT_Spirit_Board/pyportal_titano/code.py | 2 +- TFT_Spirit_Board/pyportal_titano/spirit_board.py | 16 ++++++++-------- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py index 6d0feecab..b7fe08a42 100644 --- a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py +++ b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py @@ -88,14 +88,14 @@ def _convert_locations_for_small_screen(self): _y_ratio = 240/320 # 46x print(_x_ratio, _y_ratio) - for loc_key in self.LOCATIONS.keys(): - if isinstance(self.LOCATIONS[loc_key], tuple): - _x, _y = self.LOCATIONS[loc_key] - self.LOCATIONS[loc_key] = (int(_x * _x_ratio), int(_y * _y_ratio)) - elif isinstance(self.LOCATIONS[loc_key], list): - for i in range(len(self.LOCATIONS[loc_key])): - _x, _y = self.LOCATIONS[loc_key][i] - self.LOCATIONS[loc_key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + for key, value in self.LOCATIONS.items(): + if isinstance(value, tuple): + _x, _y = value + self.LOCATIONS[key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(value, list): + for i in range(len(value)): + _x, _y = value[i] + self.LOCATIONS[key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) @staticmethod diff --git a/TFT_Spirit_Board/pyportal/code.py b/TFT_Spirit_Board/pyportal/code.py index 8551f99ba..441a4733d 100644 --- a/TFT_Spirit_Board/pyportal/code.py +++ b/TFT_Spirit_Board/pyportal/code.py @@ -16,7 +16,7 @@ from adafruit_esp32spi import adafruit_esp32spi import adafruit_touchscreen import adafruit_requests -from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError +from adafruit_io.adafruit_io import IO_HTTP from spirit_board import SpiritBoard diff --git a/TFT_Spirit_Board/pyportal/spirit_board.py b/TFT_Spirit_Board/pyportal/spirit_board.py index 6d0feecab..b7fe08a42 100644 --- a/TFT_Spirit_Board/pyportal/spirit_board.py +++ b/TFT_Spirit_Board/pyportal/spirit_board.py @@ -88,14 +88,14 @@ def _convert_locations_for_small_screen(self): _y_ratio = 240/320 # 46x print(_x_ratio, _y_ratio) - for loc_key in self.LOCATIONS.keys(): - if isinstance(self.LOCATIONS[loc_key], tuple): - _x, _y = self.LOCATIONS[loc_key] - self.LOCATIONS[loc_key] = (int(_x * _x_ratio), int(_y * _y_ratio)) - elif isinstance(self.LOCATIONS[loc_key], list): - for i in range(len(self.LOCATIONS[loc_key])): - _x, _y = self.LOCATIONS[loc_key][i] - self.LOCATIONS[loc_key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + for key, value in self.LOCATIONS.items(): + if isinstance(value, tuple): + _x, _y = value + self.LOCATIONS[key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(value, list): + for i in range(len(value)): + _x, _y = value[i] + self.LOCATIONS[key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) @staticmethod diff --git a/TFT_Spirit_Board/pyportal_titano/code.py b/TFT_Spirit_Board/pyportal_titano/code.py index e2b0ae98a..68b77d401 100644 --- a/TFT_Spirit_Board/pyportal_titano/code.py +++ b/TFT_Spirit_Board/pyportal_titano/code.py @@ -16,7 +16,7 @@ from adafruit_esp32spi import adafruit_esp32spi import adafruit_touchscreen import adafruit_requests -from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError +from adafruit_io.adafruit_io import IO_HTTP from spirit_board import SpiritBoard diff --git a/TFT_Spirit_Board/pyportal_titano/spirit_board.py b/TFT_Spirit_Board/pyportal_titano/spirit_board.py index 6d0feecab..b7fe08a42 100644 --- a/TFT_Spirit_Board/pyportal_titano/spirit_board.py +++ b/TFT_Spirit_Board/pyportal_titano/spirit_board.py @@ -88,14 +88,14 @@ def _convert_locations_for_small_screen(self): _y_ratio = 240/320 # 46x print(_x_ratio, _y_ratio) - for loc_key in self.LOCATIONS.keys(): - if isinstance(self.LOCATIONS[loc_key], tuple): - _x, _y = self.LOCATIONS[loc_key] - self.LOCATIONS[loc_key] = (int(_x * _x_ratio), int(_y * _y_ratio)) - elif isinstance(self.LOCATIONS[loc_key], list): - for i in range(len(self.LOCATIONS[loc_key])): - _x, _y = self.LOCATIONS[loc_key][i] - self.LOCATIONS[loc_key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + for key, value in self.LOCATIONS.items(): + if isinstance(value, tuple): + _x, _y = value + self.LOCATIONS[key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(value, list): + for i in range(len(value)): + _x, _y = value[i] + self.LOCATIONS[key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) @staticmethod