Files
HDRobotics/Assets/Scripts/Presenter/ProgramPresenter.cs
2025-10-24 11:55:43 +09:00

125 lines
3.5 KiB
C#

using System;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.XR.ARSubsystems;
public class ProgramPresenter
{
private ProgramModel model;
private IProgramView view;
private RobotController controlledRobot;
private string _programId;
private bool lastKnownMotorState = false;
public ProgramPresenter(ProgramModel model, IProgramView view)
{
this.model = model;
this.view = view;
this.view.OnCreateProgramClicked += async (id) => await HandleCreateProgram(id);
this.view.OnLoadProgramListRequested += HandleLoadProgramList;
this.view.OnProgramSelectedToLoad += HandleProgramSelected;
this.view.OnOpenProgramClicked += async () => await HandleOpenProgram();
this.view.OnSaveClicked += HandleSaveProgram;
this.view.OnAddPointClicked += HandleAddPoint;
}
public void RegisterControlledRobot(RobotController robot)
{
this.controlledRobot = robot;
}
public async Task UpdateMotorStateAsync()
{
try
{
bool currentState = await model.GetRobotMotorStateAsync();
if (currentState != lastKnownMotorState)
{
controlledRobot.SetMotorState(currentState);
lastKnownMotorState = currentState;
}
}
catch (Exception e)
{
Debug.LogWarning($"모터 상태 업데이트 실패: {e.Message}");
}
}
public void OnApplicationStart()
{
if (controlledRobot != null)
{
Debug.Log("제어할 로봇이 등록되었습니다.");
}
else
{
Debug.LogError("제어할 로봇이 등록되지 않았습니다");
}
}
private async Task HandleCreateProgram(string programId)
{
if (await model.CreateNewProgram(programId))
{
view.DisplayProgram(programId);
view.HideProgramSelectPanel();
OnApplicationStart();
}
else
{
view.ShowMessage($"Error: Program ID '{programId}.job' already exists or is invalid.");
}
}
private void HandleLoadProgramList()
{
var programIds = model.GetAllProgramIds();
view.ShowProgramList(programIds);
}
private void HandleProgramSelected(string programId)
{
_programId = programId;
}
private async Task HandleOpenProgram()
{
if(_programId != null && await model.LoadProgram(_programId))
{
view.DisplayProgram(_programId);
view.HideProgramSelectPanel();
view.HideProgramList();
OnApplicationStart();
_programId = null;
}
}
private void HandleSaveProgram()
{
//model.SaveCurrentProgram();
}
private void HandleAddPoint()
{
//// 실제로는 UI상의 좌표나 로봇 엔드포인트 좌표를 받아와야 함
//// 여기서는 예시로 랜덤 좌표를 사용
//Vector3 newPoint = new Vector3(Random.Range(-1f, 1f), Random.Range(0f, 1f), Random.Range(-1f, 1f));
//model.AddPointToCurrentProgram(newPoint);
//view.DisplayProgram(model.CurrentProgram);
}
private void Destroy()
{
this.view.OnCreateProgramClicked -= async (id) => await HandleCreateProgram(id);
this.view.OnLoadProgramListRequested -= HandleLoadProgramList;
this.view.OnProgramSelectedToLoad -= HandleProgramSelected;
this.view.OnOpenProgramClicked -= async () => await HandleOpenProgram();
this.view.OnSaveClicked -= HandleSaveProgram;
this.view.OnAddPointClicked -= HandleAddPoint;
}
}