/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using System.Collections.Generic; using Hermes; using Aurora.Api.Devices; namespace VisionCommon { /// /// 모션 제어를 위한 매니저 /// /// 키 정보 public class MotionManager { private object _lock = new object(); private Dictionary _motions = new Dictionary(); /// /// 모션을 등록한다. /// /// 키 정보 /// 모션 public void SetMotion(T info, IMotion motion) { lock (_lock) { if (!_motions.ContainsKey(info)) { _motions.Add(info, motion); } } } /// /// 모션을 얻어온다. /// /// 키 정보 /// 모션 public IMotion GetMotion(T info) { lock (_lock) { if (_motions.ContainsKey(info)) { return _motions[info]; } } return null; } /// /// 특정 키에 해당하는 모션을 제거한다. /// /// 키 정보 public void ClearMotion(T info) { lock (_lock) { _motions.Remove(info); } } /// /// 모든 모션을 제거한다. /// public void ClearMotions() { lock (_lock) { _motions.Clear(); } } /// /// 상대위치 이동 /// /// 키 정보 /// 상대 위치 이동량 /// 이동 결과 상태 코드 public int RelMove(T info, Position delta) { lock (_lock) { var motion = GetMotion(info); if (motion == null) { return E2.ABORTED; } return motion.RelMove(delta); } } /// /// 절대위치 이동 /// /// 키 정보 /// 이동할 절대 위치 /// 이동 결과 상태 코드 public int AbsMove(T info, Position position) { lock (_lock) { var motion = GetMotion(info); if (motion == null) { return E2.ABORTED; } return motion.AbsMove(position); } } /// /// 포지션 타입의 위치로 이동한다. /// /// 키 정보 /// 포지션 타입 /// 이동 결과 상태 코드 public int MovePosition(T info, ePositionType positionType) { lock (_lock) { var motion = GetMotion(info); if (motion == null) { return E2.ABORTED; } return motion.MovePosition(positionType); } } /// /// 현재의 위치 값을 얻어온다. /// /// 키 정보 /// 현재 위치 값 public Position GetPosition(T info) { lock (_lock) { var motion = GetMotion(info); if (motion == null) { return null; } return motion.GetPosition(); } } } }