import os import sys import json import time import argparse import threading from PyQt6.QtCore import QThread from PyQt6.QtWidgets import QApplication from robot.client_socket import SocketRobotArm from gui.init import MainContentComponent from logger import logger class MyApp: if getattr(sys, 'frozen', False): # Если приложение собрано в один файл application_path = os.path.dirname(sys.executable) else: # Если приложение запускается как скрипт application_path = os.path.dirname(os.path.abspath(__file__)) # Путь к файлу robots.json robots_json_path = os.path.join(application_path, 'robots.json') with open(robots_json_path, "r") as file: robots = json.load(file) robot_app = None def __init__(self, mode): self.mode = mode self.startGui() self.startRobot() self.startWindow() def startGui(self): self.app = QApplication(sys.argv) mainWindow = MainContentComponent( get_status=self.get_status, robotPanel={ "robots": self.robots, "updateRobot": self.updateRobot, "status": self.get_status, }, statusPanel={ "status": self.get_status, }, informerPanel={ "world_coord": self.get_world_coordinates, "axis_coord": self.get_axis_coordinates, "command_count": self.get_command_count, "updateData": self.update_data_wrapper, }, imitatorPanel={ "startImitate": self.imitate_wrapper, "imitate_point": self.get_imitate_point, }, commandPanel={ "startCommand": self.command_wrapper, "changeType": self.change_type_wrapper, "command_data": self.get_command_data, "command_type": self.get_command_type, }, visPanel={ "get_pybullet_image": self.get_pybullet_image_wrapper, }, ) mainWindow.setWindowTitle("ROBOT GUI") self.window = mainWindow def startWindow(self): self.window.show() sys.exit(self.app.exec()) def startRobot(self): self.robot_app = SocketRobotArm() # Запускаем SocketRobotArm в отдельном потоке threading.Thread(target=self.run_robot_arm, daemon=True).start() def run_robot_arm(self): time.sleep(1) self.robot_app.start("SHARED_MEMORY") def updateRobot(self, robot): if robot in self.robots: selected_robot = robot if self.mode == "test": robot["host"] = "127.0.0.1" if self.robot_app.status == "connected": self.robot_app.close() time.sleep(0.3) else: self.robot_app.connect( selected_robot["host"], selected_robot["slave_id"] ) self.robot_app.start_loop(selected_robot["urdf"]) def check_robot_app(func): def wrapper(self, *args, **kwargs): if self.robot_app: return func(self, *args, **kwargs) else: logger.info(f"robot_app еще не инициализирован. Метод: {func.__name__}") return None # Или любое значение по умолчанию return wrapper @check_robot_app def get_status(self): return self.robot_app.get_status() @check_robot_app def get_world_coordinates(self): return self.robot_app.get_world_coordinates() @check_robot_app def get_axis_coordinates(self): return self.robot_app.get_axis_coordinates() @check_robot_app def get_command_count(self): return self.robot_app.get_command_count() @check_robot_app def get_command_data(self): return self.robot_app.get_command_data() @check_robot_app def get_command_type(self): return self.robot_app.get_command_type() @check_robot_app def get_imitate_point(self): return self.robot_app.get_imitate_point() @check_robot_app def change_type_wrapper(self, type="base"): return self.robot_app.set_command_type(type) @check_robot_app def command_wrapper(self, *args, **kwargs): logger.info(args) logger.info(kwargs) return self.robot_app.cycle_start() @check_robot_app def imitate_wrapper(self, *args, **kwargs): return self.robot_app.imitate() @check_robot_app def update_data_wrapper(self, *args, **kwargs): return self.robot_app.upd_model() @check_robot_app def get_pybullet_image_wrapper(self): return self.robot_app.get_pybullet_image() if __name__ == "__main__": parser = argparse.ArgumentParser(description="MyApp Command Line Interface") parser.add_argument( "--mode", type=str, choices=["test", "prod"], default="prod", help="Mode of operation", ) # MyApp() args = parser.parse_args() app = MyApp(args.mode)