124 lines
3.8 KiB
C#
124 lines
3.8 KiB
C#
using System.Collections.Generic;
|
|
using Hermes;
|
|
using Aurora.Api.Devices;
|
|
|
|
namespace VisionCommon {
|
|
/// <summary>
|
|
/// 모션 제어를 위한 매니저
|
|
/// </summary>
|
|
/// <typeparam name="T">키 정보</typeparam>
|
|
public class MotionManager<T> {
|
|
private object _lock = new object();
|
|
private Dictionary<T, IMotion> _motions = new Dictionary<T, IMotion>();
|
|
|
|
/// <summary>
|
|
/// 모션을 등록한다.
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
/// <param name="motion">모션</param>
|
|
public void SetMotion(T info, IMotion motion) {
|
|
lock (_lock) {
|
|
if (!_motions.ContainsKey(info)) {
|
|
_motions.Add(info, motion);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 모션을 얻어온다.
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
/// <returns>모션</returns>
|
|
public IMotion GetMotion(T info) {
|
|
lock (_lock) {
|
|
if (_motions.ContainsKey(info)) {
|
|
return _motions[info];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 특정 키에 해당하는 모션을 제거한다.
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
public void ClearMotion(T info) {
|
|
lock (_lock) {
|
|
_motions.Remove(info);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 모든 모션을 제거한다.
|
|
/// </summary>
|
|
public void ClearMotions() {
|
|
lock (_lock) {
|
|
_motions.Clear();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 상대위치 이동
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
/// <param name="delta">상대 위치 이동량</param>
|
|
/// <returns>이동 결과 상태 코드</returns>
|
|
public int RelMove(T info, Position delta) {
|
|
lock (_lock) {
|
|
var motion = GetMotion(info);
|
|
if (motion == null) {
|
|
return E2.ABORTED;
|
|
}
|
|
return motion.RelMove(delta);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 절대위치 이동
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
/// <param name="position">이동할 절대 위치</param>
|
|
/// <returns>이동 결과 상태 코드</returns>
|
|
public int AbsMove(T info, Position position) {
|
|
lock (_lock) {
|
|
var motion = GetMotion(info);
|
|
if (motion == null) {
|
|
return E2.ABORTED;
|
|
}
|
|
return motion.AbsMove(position);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 포지션 타입의 위치로 이동한다.
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
/// <param name="positionType">포지션 타입</param>
|
|
/// <returns>이동 결과 상태 코드</returns>
|
|
public int MovePosition(T info, ePositionType positionType) {
|
|
lock (_lock) {
|
|
var motion = GetMotion(info);
|
|
if (motion == null) {
|
|
return E2.ABORTED;
|
|
}
|
|
return motion.MovePosition(positionType);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 현재의 위치 값을 얻어온다.
|
|
/// </summary>
|
|
/// <param name="info">키 정보</param>
|
|
/// <returns>현재 위치 값</returns>
|
|
public Position GetPosition(T info) {
|
|
lock (_lock) {
|
|
var motion = GetMotion(info);
|
|
if (motion == null) {
|
|
return null;
|
|
}
|
|
return motion.GetPosition();
|
|
}
|
|
}
|
|
}
|
|
}
|