from .game import Game from . import menu from .command import Command import os import logging import pygame from .serial import Serial import json from .games import benchmark, snake def main() -> int: logger = logging.getLogger(__name__) pygame.init() serial = Serial(os.getenv("SERIAL_DEVICE", "/dev/null"), 115200) INSTANCE = os.getenv("INSTANCE", "Unknown") pygame.display.set_caption(f"SplitScreen Duo Menu ({INSTANCE})") logging.basicConfig( level=(logging.DEBUG if os.getenv("DEVELOPMENT", "").lower() else logging.INFO) ) print("The Dual Screen Console") logger.info(f"running as {os.getenv('INSTANCE', 'unknown')}") menu.init_display() is_running = True while is_running: if INSTANCE == "secondary" and serial.in_waiting() > 0: try: data = serial.readline().decode("utf-8").strip() logger.debug(f"received serial data: {data}") message = json.loads(data) if message.get("command") == Command.QUIT.value: logger.info("received quit command from primary, shutting down") pygame.quit() return 0 elif message.get("command") == Command.SELECT_GAME.value: if message.get("value") == Game.BENCHMARK.value: logger.info("received benchmark game selection from primary") game_result = benchmark.main_loop(menu.screen, serial) if ( game_result and game_result.get("command") == Command.QUIT.value ): pygame.quit() return 0 elif message.get("value") == Game.SNAKE.value: logger.info("received snake game selection from primary") game_result = snake.main_loop(menu.screen, serial, INSTANCE) if ( game_result and game_result.get("command") == Command.QUIT.value ): pygame.quit() return 0 except json.JSONDecodeError: logger.error("failed to decode serial message") except Exception as e: logger.error(f"error processing serial data: {e}") serial_command = menu.process_events(serial, INSTANCE) if serial_command: serial.write(json.dumps(serial_command).encode("utf-8")) if serial_command.get("command") == Command.QUIT.value: logger.info("primary sent quit, shutting down") pygame.quit() return 0 elif serial_command.get("command") == Command.SELECT_GAME.value: if serial_command.get("value") == Game.BENCHMARK.value: logger.info("starting benchmark game") game_result = benchmark.main_loop(menu.screen, serial) if game_result and game_result.get("command") == Command.QUIT.value: pygame.quit() return 0 elif serial_command.get("value") == Game.SNAKE.value: logger.info("starting snake game") game_result = snake.main_loop(menu.screen, serial, INSTANCE) if game_result and game_result.get("command") == Command.QUIT.value: pygame.quit() return 0 menu.draw_menu() pygame.quit() return 0