using System; using System.Threading.Tasks; using UnityEngine; using UnityEngine.XR.ARSubsystems; public class ProgramPresenter { private ProgramModel model; private IProgramView view; private TCPView tcpView; private RobotController controlledRobot; private string _programId; private bool lastKnownMotorState = false; public ProgramPresenter(ProgramModel model, IProgramView view, TCPView tcpView) { this.model = model; this.view = view; this.tcpView = tcpView; 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; this.tcpView.OnTCPupdateRequested += HandleTCPViewUpdate; } 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 HandleTCPViewUpdate() { if (model.IsNewDataAvailable()) { RobotData data = model.GetLatestRobotData(); tcpView.SetCoordinates(data); } } 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; this.tcpView.OnTCPupdateRequested -= HandleTCPViewUpdate; } }