From 82ccc1d2e846d4fe7aae035c5a8b04570e71afab Mon Sep 17 00:00:00 2001 From: klemek Date: Thu, 5 Nov 2026 22:00:24 +0100 Subject: [PATCH] refactor: separate tools from main code --- Makefile.dev | 10 +++++ src/forge_invar/__init__.py | 41 ++++++++---------- src/forge_invar/display.py | 69 ------------------------------ src/forge_invar/tools/__init__.py | 4 ++ src/forge_invar/tools/debug_img.py | 27 ++++++++++++ src/forge_invar/tools/gen_img.py | 64 +++++++++++++++++++++++++++ 6 files changed, 123 insertions(+), 92 deletions(-) create mode 100644 src/forge_invar/tools/__init__.py create mode 100644 src/forge_invar/tools/debug_img.py create mode 100644 src/forge_invar/tools/gen_img.py diff --git a/Makefile.dev b/Makefile.dev index bc5e4ed..512c2cf 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -54,6 +54,12 @@ format: ruff-fix ruff-format ## format project .PHONY: lint lint: ruff ruff-format-check ty ## lint project +.PHONY: gen-img +gen-img: uv-run-invar-mode-gen-img + +.PHONY: debug-img +debug-img: uv-run-invar-mode-debug-img + .PHONY: rasp-init rasp-init: rasp-chmod-opt rasp-rsync rasp-unmount ## init raspberry @@ -77,6 +83,10 @@ uv-sync: ## uv sync uv-upgrade: ## uv sync upgrade $(UV) sync --active --upgrade +.PHONY: uv-run-invar-mode-% +uv-run-invar-mode-%: .venv ## uv run forge-invar --mode=(tool) + $(UV) run --active forge-invar --mode=$* + .PHONY: ruff ruff: .venv ## ruff check $(RUFF) check diff --git a/src/forge_invar/__init__.py b/src/forge_invar/__init__.py index 3db892f..b33ca5f 100644 --- a/src/forge_invar/__init__.py +++ b/src/forge_invar/__init__.py @@ -1,33 +1,13 @@ import argparse import time -from .display import ( - debug_image, - generate_background_image, - generate_loading_image, - get_display, -) +from .display import get_display from .forge_data import ForgeData from .i2c import I2C +from .tools import debug_img, gen_img -def host_generate() -> None: - data = ForgeData().mock() - generate_loading_image() - generate_background_image() - image = get_display(data, 0) - debug_image(image) - - -def main() -> None: - parser = argparse.ArgumentParser() - parser.add_argument("--generate", action="store_true") - args = parser.parse_args() - - if args.generate: - host_generate() - return - +def main_loop() -> None: t0 = time.time() with ForgeData() as data, I2C() as device: device.update_display(get_display(data, t0)) @@ -38,3 +18,18 @@ def main() -> None: continue device.update_display(get_display(data, t0)) + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument( + "--mode", default="default", choices=["default", "gen-img", "debug-img"] + ) + args = parser.parse_args() + + if args.mode == "gen-img": + gen_img() + elif args.mode == "debug-img": + debug_img() + else: + main_loop() diff --git a/src/forge_invar/display.py b/src/forge_invar/display.py index bae7ef6..96a74aa 100644 --- a/src/forge_invar/display.py +++ b/src/forge_invar/display.py @@ -157,72 +157,3 @@ def get_display(data: ForgeData, t0: float) -> Image.Image: if data.state == ForgeState.RUNNING: return __get_running_display(data) return __get_loading_display(data, t0) - - -def generate_loading_image() -> None: - global LOADING_IMG - - im = BLANK_IMG.copy() - - draw = ImageDraw.Draw(im) - - draw.text((26, 24), "F.O.R.G.E.", fill="white", font=FONT_2) - draw.rectangle((24, 35, 104, 40), outline="white", fill="black") - - im.save(LOADING_IMG_PATH) - - LOADING_IMG = im - - -def generate_background_image() -> None: - global BACKGROUND_IMG - - im = BLANK_IMG.copy() - - draw = ImageDraw.Draw(im) - - # tempo - draw.text((7, -2), "TEMPO:", fill="white", font=FONT_1) - draw.rectangle((6, 6, 60, 11), outline="white", fill="black") - - # time - draw.text((68, -2), "TIME:", fill="white", font=FONT_1) - draw.rectangle((67, 6, 121, 11), outline="white", fill="black") - - # pipes - draw.rectangle((26, 22, 78, 24), fill="white") - draw.rectangle((26, 46, 78, 48), fill="white") - draw.rectangle((78, 34, 105, 36), fill="white") - draw.rectangle((76, 23, 78, 46), fill="white") - - # squares - draw.rectangle((12, 16, 26, 30), outline="white", fill="black") - draw.rectangle((41, 16, 55, 30), outline="white", fill="black") - - draw.rectangle((12, 40, 26, 54), outline="white", fill="black") - draw.rectangle((41, 40, 55, 54), outline="white", fill="black") - - draw.rectangle((70, 28, 84, 42), outline="white", fill="black") - draw.rectangle((99, 28, 113, 42), outline="white", fill="black") - - # page - draw.circle((55, 61), 2, outline="white", fill="black") - draw.circle((63, 61), 2, outline="white", fill="black") - draw.circle((71, 61), 2, outline="white", fill="black") - - im.save(BACKGROUND_IMG_PATH) - - BACKGROUND_IMG = im - - -def debug_image(im: Image.Image) -> None: - im = im.resize((1280, 640)).convert("RGB") - - draw2 = ImageDraw.Draw(im) - - for x in range(1, 128): - draw2.line((x * 10, 0, x * 10, 640), fill=(50, 50, 50)) - for y in range(1, 64): - draw2.line((0, y * 10, 1280, y * 10), fill=(50, 50, 50)) - - im.resize((1280, 640)).save("debug.png") diff --git a/src/forge_invar/tools/__init__.py b/src/forge_invar/tools/__init__.py new file mode 100644 index 0000000..164f03c --- /dev/null +++ b/src/forge_invar/tools/__init__.py @@ -0,0 +1,4 @@ +from .debug_img import main as debug_img +from .gen_img import main as gen_img + +__all__ = ["debug_img", "gen_img"] diff --git a/src/forge_invar/tools/debug_img.py b/src/forge_invar/tools/debug_img.py new file mode 100644 index 0000000..dad7c59 --- /dev/null +++ b/src/forge_invar/tools/debug_img.py @@ -0,0 +1,27 @@ +from PIL import Image, ImageDraw + +from ..display import get_display +from ..forge_data import ForgeData + + +def debug_image(im: Image.Image) -> None: + im = im.resize((1280, 640)).convert("RGB") + + draw2 = ImageDraw.Draw(im) + + for x in range(1, 128): + draw2.line((x * 10, 0, x * 10, 640), fill=(50, 50, 50)) + for y in range(1, 64): + draw2.line((0, y * 10, 1280, y * 10), fill=(50, 50, 50)) + + im.resize((1280, 640)).save("debug.png") + + +def main(): + data = ForgeData().mock() + image = get_display(data, 0) + debug_image(image) + + +if __name__ == "__main__": + main() diff --git a/src/forge_invar/tools/gen_img.py b/src/forge_invar/tools/gen_img.py new file mode 100644 index 0000000..b575a02 --- /dev/null +++ b/src/forge_invar/tools/gen_img.py @@ -0,0 +1,64 @@ +from PIL import ImageDraw + +from ..constants import ( + BACKGROUND_IMG_PATH, + LOADING_IMG_PATH, +) +from ..display import BLANK_IMG, FONT_1, FONT_2 + + +def generate_loading_image() -> None: + im = BLANK_IMG.copy() + + draw = ImageDraw.Draw(im) + + draw.text((26, 24), "F.O.R.G.E.", fill="white", font=FONT_2) + draw.rectangle((24, 35, 104, 40), outline="white", fill="black") + + im.save(LOADING_IMG_PATH) + + +def generate_background_image() -> None: + im = BLANK_IMG.copy() + + draw = ImageDraw.Draw(im) + + # tempo + draw.text((7, -2), "TEMPO:", fill="white", font=FONT_1) + draw.rectangle((6, 6, 60, 11), outline="white", fill="black") + + # time + draw.text((68, -2), "TIME:", fill="white", font=FONT_1) + draw.rectangle((67, 6, 121, 11), outline="white", fill="black") + + # pipes + draw.rectangle((26, 22, 78, 24), fill="white") + draw.rectangle((26, 46, 78, 48), fill="white") + draw.rectangle((78, 34, 105, 36), fill="white") + draw.rectangle((76, 23, 78, 46), fill="white") + + # squares + draw.rectangle((12, 16, 26, 30), outline="white", fill="black") + draw.rectangle((41, 16, 55, 30), outline="white", fill="black") + + draw.rectangle((12, 40, 26, 54), outline="white", fill="black") + draw.rectangle((41, 40, 55, 54), outline="white", fill="black") + + draw.rectangle((70, 28, 84, 42), outline="white", fill="black") + draw.rectangle((99, 28, 113, 42), outline="white", fill="black") + + # page + draw.circle((55, 61), 2, outline="white", fill="black") + draw.circle((63, 61), 2, outline="white", fill="black") + draw.circle((71, 61), 2, outline="white", fill="black") + + im.save(BACKGROUND_IMG_PATH) + + +def main(): + generate_loading_image() + generate_background_image() + + +if __name__ == "__main__": + main()