refactor: separate tools from main code

This commit is contained in:
2026-11-05 22:00:24 +01:00
parent dad509768b
commit 82ccc1d2e8
6 changed files with 123 additions and 92 deletions
+10
View File
@@ -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
+18 -23
View File
@@ -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()
-69
View File
@@ -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")
+4
View File
@@ -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"]
+27
View File
@@ -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()
+64
View File
@@ -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()