/*
* 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();
}
}
}
}