using System; using System.Collections.Generic; using System.Drawing; using AGVNavigationCore.Controls; using AGVNavigationCore.PathFinding; using AGVNavigationCore.PathFinding.Core; namespace AGVNavigationCore.Models { /// /// 이동 가능한 AGV 인터페이스 /// 실제 AGV와 시뮬레이션 AGV 모두 구현해야 하는 기본 인터페이스 /// public interface IMovableAGV { #region Events /// /// AGV 상태 변경 이벤트 /// event EventHandler StateChanged; /// /// 위치 변경 이벤트 /// event EventHandler<(Point, AgvDirection, MapNode)> PositionChanged; /// /// RFID 감지 이벤트 /// event EventHandler RfidDetected; /// /// 경로 완료 이벤트 /// event EventHandler PathCompleted; /// /// 오류 발생 이벤트 /// event EventHandler ErrorOccurred; #endregion #region Properties /// /// AGV ID /// string AgvId { get; } /// /// 현재 위치 /// Point CurrentPosition { get; set; } /// /// 현재 방향 (모터 방향) /// AgvDirection CurrentDirection { get; set; } /// /// 현재 상태 /// AGVState CurrentState { get; set; } /// /// 현재 속도 /// float CurrentSpeed { get; } /// /// 배터리 레벨 (0-100%) /// float BatteryLevel { get; set; } /// /// 현재 경로 /// AGVPathResult CurrentPath { get; } /// /// 현재 노드 ID /// MapNode CurrentNode { get; } /// /// 목표 위치 /// Point? PrevPosition { get; } /// /// 목표 노드 ID /// MapNode PrevNode { get; } /// /// 도킹 방향 /// DockingDirection DockingDirection { get; } #endregion #region Sensor Input Methods (실제 AGV에서 호출) /// /// 현재 위치 설정 (실제 위치 센서에서) /// void SetCurrentPosition(Point position); /// /// 감지된 RFID 설정 (실제 RFID 센서에서) /// void SetDetectedRfid(string rfidId); /// /// 모터 방향 설정 (모터 컨트롤러에서) /// void SetMotorDirection(AgvDirection direction); /// /// 배터리 레벨 설정 (BMS에서) /// void SetBatteryLevel(float percentage); #endregion #region State Query Methods /// /// 현재 위치 조회 /// Point GetCurrentPosition(); /// /// 현재 상태 조회 /// AGVState GetCurrentState(); /// /// 현재 노드 ID 조회 /// MapNode GetCurrentNode(); /// /// AGV 상태 정보 문자열 조회 /// string GetStatus(); #endregion #region Path Execution Methods /// /// 경로 정지 /// void StopPath(); /// /// 긴급 정지 /// void EmergencyStop(); #endregion #region Update Method /// /// 프레임 업데이트 (외부에서 주기적으로 호출) /// 이 방식으로 타이머에 의존하지 않고 외부에서 제어 가능 /// /// 마지막 업데이트 이후 경과 시간 (밀리초) void Update(float deltaTimeMs); #endregion #region Manual Control Methods (테스트용) /// /// 수동 이동 /// void MoveTo(Point targetPosition); /// /// 수동 회전 /// void Rotate(AgvDirection direction); /// /// 충전 시작 /// void StartCharging(); /// /// 충전 종료 /// void StopCharging(); #endregion #region Cleanup /// /// 리소스 정리 /// void Dispose(); #endregion } }