9c31de3c38
config into dataclass and enums new Gui that includes settings deleted GlobalVariables small fixes (import, names...)
85 lines
2.3 KiB
Python
85 lines
2.3 KiB
Python
"""
|
|
main.py - Entry point handling dynamic input source selection
|
|
"""
|
|
from multiprocessing import Queue, Process
|
|
import time
|
|
|
|
from config import cfg
|
|
from Robot import Robot
|
|
from gui.MainWindow import (
|
|
create_parameter_gui,
|
|
render_gui_frame,
|
|
stop_gui,
|
|
resolve_active_command
|
|
)
|
|
from inputs.PygameController import controller_loop
|
|
|
|
robot_instance: Robot | None = None
|
|
is_robot_active = False
|
|
|
|
|
|
def start_robot():
|
|
global robot_instance, is_robot_active
|
|
print(f"[Main] Starting Robot with Backend: {cfg.backend.value.upper()}")
|
|
robot_instance = Robot(backend_type=cfg.backend)
|
|
robot_instance.reset_to_init()
|
|
is_robot_active = True
|
|
|
|
|
|
def stop_robot():
|
|
global robot_instance, is_robot_active
|
|
print("[Main] Stopping Robot...")
|
|
is_robot_active = False
|
|
if robot_instance is not None:
|
|
robot_instance.cleanup()
|
|
robot_instance = None
|
|
|
|
|
|
def main_event_loop(control_queue: Queue):
|
|
global robot_instance, is_robot_active
|
|
|
|
create_parameter_gui(
|
|
on_start_callback=start_robot,
|
|
on_stop_callback=stop_robot
|
|
)
|
|
|
|
next_time = time.time()
|
|
|
|
try:
|
|
while True:
|
|
next_time += cfg.tick_duration
|
|
|
|
# Drain latest gamepad frame if available
|
|
gamepad_cmd = None
|
|
while not control_queue.empty():
|
|
gamepad_cmd = control_queue.get_nowait()
|
|
|
|
# Resolve motion vector based on current active dropdown mode
|
|
active_cmd = resolve_active_command(gamepad_cmd)
|
|
|
|
# Pass inputs to robot and tick state machine
|
|
if is_robot_active and robot_instance is not None:
|
|
robot_instance.robot_state = active_cmd["state"]
|
|
robot_instance.vector_dirmov = active_cmd["dirmov"]
|
|
robot_instance.tick()
|
|
|
|
render_gui_frame()
|
|
|
|
sleep_time = next_time - time.time()
|
|
if sleep_time > 0:
|
|
time.sleep(sleep_time)
|
|
|
|
finally:
|
|
stop_gui()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
control_queue = Queue()
|
|
|
|
controller_process = Process(target=controller_loop, args=(control_queue,))
|
|
controller_process.start()
|
|
|
|
try:
|
|
main_event_loop(control_queue)
|
|
finally:
|
|
controller_process.terminate() |