From b2c3e32d7afc1deef42d7ef38f40adc9b87a7cd7 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Fri, 1 Dec 2023 11:22:56 -0600 Subject: [PATCH 1/7] Convert to package --- .../adafruit_pycamera.py | 0 .../ov5640_autofocus.bin | Bin .../ov5640_autofocus.bin.license | 0 pyproject.toml | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename adafruit_pycamera.py => adafruit_pycamera/adafruit_pycamera.py (100%) rename ov5640_autofocus.bin => adafruit_pycamera/ov5640_autofocus.bin (100%) rename ov5640_autofocus.bin.license => adafruit_pycamera/ov5640_autofocus.bin.license (100%) diff --git a/adafruit_pycamera.py b/adafruit_pycamera/adafruit_pycamera.py similarity index 100% rename from adafruit_pycamera.py rename to adafruit_pycamera/adafruit_pycamera.py diff --git a/ov5640_autofocus.bin b/adafruit_pycamera/ov5640_autofocus.bin similarity index 100% rename from ov5640_autofocus.bin rename to adafruit_pycamera/ov5640_autofocus.bin diff --git a/ov5640_autofocus.bin.license b/adafruit_pycamera/ov5640_autofocus.bin.license similarity index 100% rename from ov5640_autofocus.bin.license rename to adafruit_pycamera/ov5640_autofocus.bin.license diff --git a/pyproject.toml b/pyproject.toml index a7d0666..5fbf4d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ dynamic = ["dependencies", "optional-dependencies"] [tool.setuptools] # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER, # CHANGE `py_modules = ['...']` TO `packages = ['...']` -py-modules = ["adafruit_pycamera"] +packages = ["adafruit_pycamera"] [tool.setuptools.dynamic] dependencies = {file = ["requirements.txt"]} From 2919dcddad6ff4084504cada7d3c97cd510b3807 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 4 Dec 2023 10:05:48 -0600 Subject: [PATCH 2/7] reset the tft just once .. because resetting it will also reset the IO expander and that's bad --- adafruit_pycamera/{adafruit_pycamera.py => __init__.py} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename adafruit_pycamera/{adafruit_pycamera.py => __init__.py} (99%) diff --git a/adafruit_pycamera/adafruit_pycamera.py b/adafruit_pycamera/__init__.py similarity index 99% rename from adafruit_pycamera/adafruit_pycamera.py rename to adafruit_pycamera/__init__.py index d71b8e2..b5313a3 100644 --- a/adafruit_pycamera/adafruit_pycamera.py +++ b/adafruit_pycamera/__init__.py @@ -531,7 +531,7 @@ def resolution(self, res): self._res_label.text = self.resolutions[res] self.display.refresh() - def init_display(self): + def init_display(self, reset=board.TFT_RESET): """Initialize the TFT display""" # construct displayio by hand displayio.release_displays() @@ -539,7 +539,7 @@ def init_display(self): self._spi, command=board.TFT_DC, chip_select=board.TFT_CS, - reset=board.TFT_RESET, + reset=reset, baudrate=60_000_000, ) self.display = board.DISPLAY @@ -567,7 +567,7 @@ def display_message(self, message, color=0xFF0000, scale=3): text_area = label.Label(terminalio.FONT, text=message, color=color, scale=scale) text_area.anchor_point = (0.5, 0.5) if not self.display: - self.init_display() + self.init_display(None) text_area.anchored_position = (self.display.width / 2, self.display.height / 2) # Show it @@ -611,7 +611,7 @@ def mount_sd_card(self): vfs = storage.VfsFat(self.sdcard) print("mount vfs @", time.monotonic() - self._timestamp) storage.mount(vfs, "/sd") - self.init_display() + self.init_display(None) self._image_counter = 0 self._sd_label.text = "SD OK" self._sd_label.color = 0x00FF00 From 1fecc90a22f36564cef93ad7f9c392c5b3332714 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 4 Dec 2023 10:09:08 -0600 Subject: [PATCH 3/7] remove some debug prints --- adafruit_pycamera/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/adafruit_pycamera/__init__.py b/adafruit_pycamera/__init__.py index b5313a3..ff7abf1 100644 --- a/adafruit_pycamera/__init__.py +++ b/adafruit_pycamera/__init__.py @@ -159,8 +159,6 @@ class PyCamera: # pylint: disable=too-many-instance-attributes,too-many-public- # espcamera.FrameSize.P_FHD, # 1080x1920 espcamera.FrameSize.QSXGA, # 2560x1920 ) - combined_list = list(zip(resolutions, resolution_to_frame_size)) - print(combined_list) effects = ( "Normal", From 2ae4d81ed61233782669b4ee2342c40b57d7c193 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 4 Dec 2023 10:09:13 -0600 Subject: [PATCH 4/7] comment this --- adafruit_pycamera/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/adafruit_pycamera/__init__.py b/adafruit_pycamera/__init__.py index ff7abf1..f670af6 100644 --- a/adafruit_pycamera/__init__.py +++ b/adafruit_pycamera/__init__.py @@ -585,7 +585,9 @@ def mount_sd_card(self): self._card_power.value = True card_cs = DigitalInOut(board.CARD_CS) card_cs.switch_to_output(False) - # deinit display and SPI + # deinit display and SPI bus because we need to drive all SD pins LOW + # to ensure nothing, not even an I/O pin, could possibly power the SD + # card self.deinit_display() self._spi.deinit() sckpin = DigitalInOut(board.SCK) From a3f6454284b0a95b390f9393c2ff1d1bafa75977 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 4 Dec 2023 10:09:42 -0600 Subject: [PATCH 5/7] add GBOY mode --- adafruit_pycamera/__init__.py | 4 ++-- examples/camera/code.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/adafruit_pycamera/__init__.py b/adafruit_pycamera/__init__.py index f670af6..ce252b4 100644 --- a/adafruit_pycamera/__init__.py +++ b/adafruit_pycamera/__init__.py @@ -170,7 +170,7 @@ class PyCamera: # pylint: disable=too-many-instance-attributes,too-many-public- "Sepia", "Solarize", ) - modes = ("JPEG", "GIF", "STOP") + modes = ("JPEG", "GIF", "GBOY", "STOP") _INIT_SEQUENCE = ( b"\x01\x80\x78" # _SWRESET and Delay 120ms @@ -488,7 +488,7 @@ def mode(self, setting): self._mode_label.text = self.modes[setting] if self.modes[setting] == "STOP": self.stop_motion_frame = 0 - if self.modes[setting] == "GIF": + if self.modes[setting] in ("GIF", "GBOY"): self._res_label.text = "" else: self.resolution = self.resolution # kick it to reset the display diff --git a/examples/camera/code.py b/examples/camera/code.py index 75b2996..de10475 100644 --- a/examples/camera/code.py +++ b/examples/camera/code.py @@ -30,6 +30,11 @@ onionskin, last_frame, new_frame, displayio.Colorspace.RGB565_SWAPPED ) pycam.blit(onionskin) + elif pycam.mode_text == "GBOY": + bitmaptools.dither( + last_frame, pycam.continuous_capture(), displayio.Colorspace.RGB565_SWAPPED + ) + pycam.blit(last_frame) else: pycam.blit(pycam.continuous_capture()) # print("\t\t", capture_time, blit_time) @@ -57,6 +62,23 @@ time.sleep(0.5) pycam.live_preview_mode() + if pycam.mode_text == "GBOY": + try: + f = pycam.open_next_image("gif") + except RuntimeError as e: + pycam.display_message("Error\nNo SD Card", color=0xFF0000) + time.sleep(0.5) + continue + + with gifio.GifWriter( + f, + pycam.camera.width, + pycam.camera.height, + displayio.Colorspace.RGB565_SWAPPED, + dither=True, + ) as g: + g.add_frame(last_frame, 1) + if pycam.mode_text == "GIF": try: f = pycam.open_next_image("gif") From 5ebddd4abbc9eb1caf9f3682d3d39de53e2d2298 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 4 Dec 2023 10:15:34 -0600 Subject: [PATCH 6/7] change reset slightly to work with doc build --- adafruit_pycamera/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_pycamera/__init__.py b/adafruit_pycamera/__init__.py index ce252b4..0f6f416 100644 --- a/adafruit_pycamera/__init__.py +++ b/adafruit_pycamera/__init__.py @@ -529,7 +529,7 @@ def resolution(self, res): self._res_label.text = self.resolutions[res] self.display.refresh() - def init_display(self, reset=board.TFT_RESET): + def init_display(self, reset=True): """Initialize the TFT display""" # construct displayio by hand displayio.release_displays() @@ -537,7 +537,7 @@ def init_display(self, reset=board.TFT_RESET): self._spi, command=board.TFT_DC, chip_select=board.TFT_CS, - reset=reset, + reset=board.TFT_RESET if reset else None, baudrate=60_000_000, ) self.display = board.DISPLAY From e043a31f9dcb3878c6a3df1199fc912cd553d8c0 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 4 Dec 2023 10:17:29 -0600 Subject: [PATCH 7/7] finish hiding resolution label in GIF/GBOY modes --- adafruit_pycamera/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/adafruit_pycamera/__init__.py b/adafruit_pycamera/__init__.py index 0f6f416..d5abdab 100644 --- a/adafruit_pycamera/__init__.py +++ b/adafruit_pycamera/__init__.py @@ -449,7 +449,10 @@ def select_setting(self, setting_name): self._effect_label.background_color = 0x0 self._res_label.color = 0xFFFFFF self._res_label.background_color = 0x0 - self._res_label.text = self.resolutions[self._resolution] + if self.mode_text in ("GIF", "GBOY"): + self._res_label.text = "" + else: + self._res_label.text = self.resolutions[self._resolution] self._mode_label.color = 0xFFFFFF self._mode_label.background_color = 0x0 if setting_name == "effect":